动态投入Kotlin

我想通过使用KClass<Int> ,具有一个KClass<Int>和一个Any实际为IntAnyInt

 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)