Generics Kotlin浮点/int间接比较
对于一个项目,我试图实现一个Generics Kotlin浮点/int间接比较,generics,kotlin,casting,floating-point,Generics,Kotlin,Casting,Floating Point,对于一个项目,我试图实现一个Bit类,它完成了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).v
Bit
类,它完成了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
我以为这是某种近似错误,但当我尝试打印(0f!=0)
时,我得到了运算符“!=”无法应用于“Float”和“Int”
。然而,通过构造器比较数字没有问题
我觉得这里有一些我不知道的隐藏式施法魔法,所以我的问题基本上是“为什么它不能按预期的方式运行,以及怎样才能让它按预期的方式运行?”我不能确切地告诉你为什么它不能按预期的方式运行,但我可以给你一个简单的解决方法
Number
界面没有您想要的那么强大,但它提供的主要功能是将其值转换为任何标准数字类型。您可以这样使用:
class Bit(value: Number) {
var value = if (value.toDouble() == 0.0) 0 else 1
}
这将适用于所有的Number
实现:Byte
,Double
,Float
,Int
,Long
,Short
,AtomicInteger
,BigDecimal
,Striped64
,以及您编写或导入的任何其他内容
(无论您做什么,我建议您也重写value
的setter,以确保它只包含0或1。)它与中所述的装箱值表示有关
正如您所注意到的,您无法比较不同的类型(当以本机方式表示Float
和Int
时)。但您并没有这样做,而是使用了Number
类型
考虑以下示例:
println(0.0f == 0) // error: Operator '==' cannot be applied to 'Float' and 'Int'
val n : Number = 0L // this forces value to be boxed
println(n == 0) // compiles and prints false
首先,编译器警告您不可能执行比较。但是,如果用对象框住数值,则可以使用现有的equalsTo
运算符
您将发现,当且仅当双方的类型和值相同时,它才会返回true
我不想给你们带来麻烦,但实现类的正确方法是为每种数字类型声明单独的构造函数。这将阻止编译器装箱您的值,并允许您正确确定相等性:
class Bit constructor(value : Boolean) {
val value = if(value) 1 else 0
constructor(value : Int) : this(value == 0)
constructor(value : Float) : this(value == 0f)
constructor(value : Long) : this(value == 0L)
// etc
}
您使用的是什么kotlin版本?我甚至无法编译您的示例(错误出现在.toInt()
cast上)。@Pawel哦,对不起!我自己为布尔人实现了toInt()
,作为一个简单的if(someBool)1-else 0
,我也编辑了这个问题。但是,我尝试了类似-0.5f
的东西,当通过时。toInt()
给出0
,创建位0
,当-0.5
时,不应产生0
位。简言之,它会截断。(感谢你的提示,这个类实际上相当大,并且完全经过单元测试,并且已经有了setter^^)哇!但我现在编辑了它,通过将其转换为double而不是int来解决这个问题。这似乎适用于我尝试过的所有整数值和非整数值。