对于我正在尝试实现 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/