generics - Kotlin float/int 间接比较

标签 generics kotlin casting floating-point

对于我正在尝试实现 Bit 的项目类,这做了所有应该做的通常的事情。

构造函数应该能够接受任何 Number并设置 Bit的内部状态为 0如果给定值为 0 , 否则设置为 1 .

所有适用于整数输入,但是当我开始 float 时...显然 0.0不等于 0 .

class Bit(value: Number) {
    var value: Int = (value != 0).toInt() // I implemented Bool-to-Int myself
}

现在的问题:
println(Bit(0).value)   // Prints 0
println(Bit(0f).value)  // Prints 1

我认为这是某种近似错误,但当我尝试 print(0f != 0)我得到了Operator '!=' cannot be applied to 'Float' and 'Int' .但是,通过构造函数比较数字没有问题。

我觉得这里有一些我不知道的隐藏的类型转换魔法,所以我的问题基本上是“为什么这没有按预期运行,什么是让它按预期运行的优雅方式?”

最佳答案

我不能确切地告诉你为什么它的行为不像你期望的那样,但我可以给你一个简单的解决方法!
Number接口(interface)没有你想的那么强大,但它给你的主要功能是一种将它的值转换为任何标准数字类型的方法。你可以像这样使用它:

class Bit(value: Number) {
    var value = if (value.toDouble() == 0.0) 0 else 1
}

这适用于所有 Number实现:Byte , Double , Float , Int , Long , Short , AtomicInteger , AtomicLong , BigDecimal , Striped64 ,以及您编写或导入的任何其他内容。

(无论你做什么,我建议你也覆盖 value 的 setter ,以确保它只包含 0 或 1。)

关于generics - Kotlin float/int 间接比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56384951/

相关文章:

android - 使用 LinearSnapHelper 在 recyclerview 中捕捉第一个和最后一个项目的问题

iphone - 在方法之间传递时 float 被破坏(类型转换问题?)

swift - 是否可以将 Any 转换为 Optional?

ios - 使用枚举和泛型快速扩展类的 Where 子句

c# - 使用 'typeof'和 'is'时,c#如何共享引用类型的泛型实现?

c# - 列表 <BusinessObject> 还是 BusinessObjectCollection?

TypeScript:推断带注释对象内部类型的泛型

java - Android kotlin 扩展错误

c++ - 将基础实例指针转换为派生实例指针是否合法? (该实例不是派生实例)

kotlin - Ktor 与 Koin DI 无法注入(inject),缺少 clazz