动态投入Kotlin
我想通过使用KClass<Int>
,具有一个KClass<Int>
和一个Any
实际为Int
的Any
为Int
。
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
?
尝试改变你的代码
fun <T: Any> cast(any: Any, clazz: KClass<out T>): T = clazz.javaObjectType.cast(any)
说明
由于参数any
的类型是Any
,它总是一个引用类型,原语将被装箱。 对于第二个参数,似乎Kotlin反射会偏爱原始类型到引用类型,这就是为什么Int::class.java
将默认为“不是Intrger
。 通过使用javaObjectType
我们强制使用盒装引用类型。
替代
你也可以使用下面的函数定义:
inline fun <reified T: Any> cast(any: Any): T = T::class.javaObjectType.cast(any) // usage cast<Int>(0)