我正在学习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; }
我做错了什么?
xsuvu9jc1#
为了确认其他答案,并纠正Kotlin中似乎常见的误解,我喜欢这样说:
强制转换不会将一个值转换为另一种类型;强制转换向编译器承诺该值已经 * 是 * 新类型。
如果你有一个Any或Number引用碰巧指向一个Float对象:
Any
Number
Float
val myNumber: Any = 6f
然后你可以将其转换为Float:
myNumber as Float
但这只是因为对象已经 * 是 * 一个Float;我们只需要告诉编译器。这对另一个数字类型不起作用;下面将给予ClassCastException:
ClassCastException
myNumber as Double
要 * 转换 * 数字,您不使用强制转换;您使用其中一个转换函数,例如:
myNumber.toDouble()
一些混淆可能是因为像C和Java这样的语言对数字类型相当宽松,并且在许多情况下执行静默转换。那会很方便;但它也可能导致细微的错误。对于大多数开发人员来说,底层的位处理和计算已经不像40年前甚至20年前那么重要了,因此Kotlin将一些数字特殊情况移到了标准库中,并需要显式转换,带来了额外的安全性。
w46czmvw2#
异常的堆栈跟踪几乎解释了为什么强制转换永远不会成功:不能将java.lang.Integer转换为java.lang.Floatjava.lang.Integer和java.lang.Float都没有扩展另一个类,所以不能用as将java.lang.Integer转换为java.lang.Float(反之亦然)。你应该使用.toFloat()。
java.lang.Integer
java.lang.Float
as
.toFloat()
fun divide(a: Int, b: Int): Float { return a.toFloat() / b }
wztqucjr3#
正如它所指出的,Int不能转换为Float。然而,kotlin.Int和kotlin.Float都继承了kotlin.Number,它定义了abstract fun toFloat(): Float。这就是您在此场景中所需要的。
kotlin.Int
kotlin.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了解更多信息。
qmelpv7a4#
另一种方式
fun divide(a: Int, b: Int) = a.div(b).toFloat()
4条答案
按热度按时间xsuvu9jc1#
为了确认其他答案,并纠正Kotlin中似乎常见的误解,我喜欢这样说:
强制转换不会将一个值转换为另一种类型;强制转换向编译器承诺该值已经 * 是 * 新类型。
如果你有一个
Any
或Number
引用碰巧指向一个Float
对象:然后你可以将其转换为Float:
但这只是因为对象已经 * 是 * 一个
Float
;我们只需要告诉编译器。这对另一个数字类型不起作用;下面将给予ClassCastException
:要 * 转换 * 数字,您不使用强制转换;您使用其中一个转换函数,例如:
一些混淆可能是因为像C和Java这样的语言对数字类型相当宽松,并且在许多情况下执行静默转换。那会很方便;但它也可能导致细微的错误。对于大多数开发人员来说,底层的位处理和计算已经不像40年前甚至20年前那么重要了,因此Kotlin将一些数字特殊情况移到了标准库中,并需要显式转换,带来了额外的安全性。
w46czmvw2#
异常的堆栈跟踪几乎解释了为什么强制转换永远不会成功:
不能将java.lang.Integer转换为java.lang.Float
java.lang.Integer
和java.lang.Float
都没有扩展另一个类,所以不能用as
将java.lang.Integer
转换为java.lang.Float
(反之亦然)。你应该使用
.toFloat()
。wztqucjr3#
正如它所指出的,Int不能转换为Float。然而,
kotlin.Int
和kotlin.Float
都继承了kotlin.Number
,它定义了abstract fun toFloat(): Float
。这就是您在此场景中所需要的。请参阅https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/to-float.html了解更多信息。
qmelpv7a4#
另一种方式