对于一个项目,我正在尝试实现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实现:ByteDoubleFloatIntLongShortAtomicIntegerAtomicLongBigDecimalStriped64以及您编写或导入的任何其他代码。

(无论您做什么,我建议您也重写value的setter,以确保它只保留0或1。)

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

10-13 04:38
查看更多