generics - Kotlin float/int 间接比较
问题描述
对于我正在尝试实现一个Bit
类的项目,它可以完成所有应该做的所有常见事情。
如果给定值为,则构造函数应该能够接受任何Number
并将Bit
的内部状态设置为,否则将其设置为。0
0
1
所有适用于整数输入,但是当我浮动时......显然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
接口没有您希望的那么强大,但它为您提供的主要功能是将其值转换为任何标准数字类型的方法。你可以像这样使用它:
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
's setter,以确保它只包含 0 或 1。)
推荐阅读
- google-apps-script - 通过 Google App Script 将订阅者添加到 Mailchimp 列表
- javascript - 如何在 JavaScript 中测试一个类的实例是否存在
- email - 后缀/鸽舍设置中的 SASL:它在哪里使用?
- python - 如何对列表列表进行排序并仅保留每个第一个元素的最大第二个元素?
- javascript - Vue.js - while 循环替代方案
- html - Visual Studio Blazor:遇到没有匹配开始标记的结束标记“br”
- c++ - 使用 >> 运算符重载时出错
- python - 如何使用 selenium webdriver 获取没有类名和 id 的元素
- c# - 要执行的 C# CMD 参数
- android - 如何使用 Kotlin 在 Android 中设置 SurfaceTextureListener?