Kotlin将Int转换为Float

ac1kyiln  于 2023-05-23  发布在  Kotlin
关注(0)|答案(4)|浏览(381)

我正在学习Kotlin,我刚刚从控制台制作了一个计算器程序。我有函数要做加法,除法等等当我尝试将整数转换为float时,我得到这个错误:
线程“main”出现异常java.lang.ClassCastException:不能将java.lang.Integer转换为java.lang.Float
函数如下:

fun divide(a: Int, b: Int): Float {
    return a as Float / b as Float;
}

我做错了什么?

xsuvu9jc

xsuvu9jc1#

为了确认其他答案,并纠正Kotlin中似乎常见的误解,我喜欢这样说:

强制转换不会将一个值转换为另一种类型;强制转换向编译器承诺该值已经 * 是 * 新类型。

如果你有一个AnyNumber引用碰巧指向一个Float对象:

val myNumber: Any = 6f

然后你可以将其转换为Float:

myNumber as Float

但这只是因为对象已经 * 是 * 一个Float;我们只需要告诉编译器。这对另一个数字类型不起作用;下面将给予ClassCastException

myNumber as Double

要 * 转换 * 数字,您不使用强制转换;您使用其中一个转换函数,例如:

myNumber.toDouble()

一些混淆可能是因为像C和Java这样的语言对数字类型相当宽松,并且在许多情况下执行静默转换。那会很方便;但它也可能导致细微的错误。对于大多数开发人员来说,底层的位处理和计算已经不像40年前甚至20年前那么重要了,因此Kotlin将一些数字特殊情况移到了标准库中,并需要显式转换,带来了额外的安全性。

w46czmvw

w46czmvw2#

异常的堆栈跟踪几乎解释了为什么强制转换永远不会成功:
不能将java.lang.Integer转换为java.lang.Float
java.lang.Integerjava.lang.Float都没有扩展另一个类,所以不能用asjava.lang.Integer转换为java.lang.Float(反之亦然)。
你应该使用.toFloat()

fun divide(a: Int, b: Int): Float {
    return a.toFloat() / b
}
wztqucjr

wztqucjr3#

正如它所指出的,Int不能转换为Float。然而,kotlin.Intkotlin.Float都继承了kotlin.Number,它定义了abstract fun toFloat(): Float。这就是您在此场景中所需要的。

fun divide(a:Int, b:Int): Float {
  return a.toFloat() / b.toFloat()
}

请参阅https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/to-float.html了解更多信息。

qmelpv7a

qmelpv7a4#

另一种方式

fun divide(a: Int, b: Int) = a.div(b).toFloat()

相关问题