对于一个项目,我正在尝试实现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/