Kotlin铸造内件至浮子
我正在学习Kotlin,我刚从控制台制作了一个计算器程序。 我有求和、除法等函数,当我尝试将其转换为整数以浮点数时,会出现以下错误: 线程“main”java.lang.ClassCastException中的异常:无法将java.lang.Integer转换为java.lang.Float 其功能是:Kotlin铸造内件至浮子,kotlin,casting,Kotlin,Casting,我正在学习Kotlin,我刚从控制台制作了一个计算器程序。 我有求和、除法等函数,当我尝试将其转换为整数以浮点数时,会出现以下错误: 线程“main”java.lang.ClassCastException中的异常:无法将java.lang.Integer转换为java.lang.Float 其功能是: fun divide(a:Int,b:Int):Float{ return a as Float / b as Float; } 我做错了什么?异常的stacktrace很好地解释了为
fun divide(a:Int,b:Int):Float{
return a as Float / b as Float;
}
我做错了什么?异常的stacktrace很好地解释了为什么强制转换永远不会成功: 无法将java.lang.Integer转换为java.lang.Float
java.lang.Integer
和java.lang.Float
这两个类都没有扩展另一个类,因此您不能将java.lang.Integer
转换为java.lang.Float
(反之亦然)
您应该使用.toFloat()
fun divide(a:Int,b:Int):浮点{
返回a.toFloat()/b
}
如它所述,Int不能转换为Float。但是kotlin.Int
和kotlin.Float
都继承了kotlin.Number
,它定义了abstract fun toFloat():Float
。这就是您在此场景中需要的
fun divide(a:Int, b:Int): Float {
return a.toFloat() / b.toFloat()
}
有关更多信息,请参阅 为了确认其他答案,并纠正Kotlin中常见的误解,我喜欢用以下方式表达: 强制转换不会将值转换为其他类型;强制转换向编译器保证值已经是新类型。 如果有一个
Any
或Number
引用恰好指向一个Float
对象:
val myNumber: Any = 6f
然后你可以把它扔到浮球上:
myNumber as Float
但这仅仅是因为对象已经是一个浮点
;我们只需要告诉编译器,这对另一个数字类型不起作用;下面将给出一个ClassCastException
:
myNumber as Double
要转换数字,不使用强制转换;您可以使用其中一种转换功能,例如:
myNumber.toDouble()
有些混淆可能是因为C和Java等语言对数字类型的要求相当宽松,在许多情况下执行静默转换;但它也会导致一些微妙的错误。对大多数开发人员来说,低级的位旋转和计算不如40年甚至20年前那么重要,因此Kotlin将一些数字特例移动到标准库中,并需要显式转换,带来额外的安全性。另一种方法
fun divide(a: Int, b: Int) = a.div(b).toFloat()
在某些情况下,编译器可以确定何时强制转换将失败,因此在运行时会出现编译错误,而不是ClassCastException。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常质量更高,更容易吸引选票。