我想使用Any
将Int
投放到KClass<Int>
,KClass<Int>
和Any
实际为Int
。< / p>
fun <T> cast(any: Any, clazz: KClass<*>): T = clazz.java.cast(any)
cast(0, Int::class)
但是,我收到了这个错误。
java.lang.ClassCastException:无法将java.lang.Integer强制转换为int
您知道除any as Int
以外的任何解决方案吗?
答案 0 :(得分:5)
尝试将代码更改为
fun <T: Any> cast(any: Any, clazz: KClass<out T>): T = clazz.javaObjectType.cast(any)
因为参数any
的类型是Any
,所以它始终是引用类型,并且基元将被加框。对于第二个参数,Kotlin反射似乎更喜欢基元类型来引用类型,这就是Int::class.java
默认为ìnt
而不是Integer
的原因。通过使用javaObjectType
,我们强制使用盒装引用类型。
您还可以使用以下函数定义:
inline fun <reified T: Any> cast(any: Any): T = T::class.javaObjectType.cast(any)
// usage
cast<Int>(0)
答案 1 :(得分:0)
Kirill Rakhman的答案非常适合非空类型。但是,如果T为可为空,则我们不能拥有T :: class。因此,我建议以下内容处理可空类型。
inline fun <reified T> cast(any: Any?): T = any as T
用法
val l32: Number = cast(32L)
val ln1: Number? = cast(null) // works
val ln2: Number = cast(null) // fails at runtime