Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Kotlin浮点/int间接比较_Generics_Kotlin_Casting_Floating Point - Fatal编程技术网

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来解决这个问题。这似乎适用于我尝试过的所有整数值和非整数值。