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
Kotlin铸造内件至浮子_Kotlin_Casting - Fatal编程技术网

Kotlin铸造内件至浮子

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很好地解释了为

我正在学习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很好地解释了为什么强制转换永远不会成功:

无法将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。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常质量更高,更容易吸引选票。