mmo*_*iro 6 java casting kotlin
我想投Any给Int用KClass<Int>,有KClass<Int>和Any这实际上是Int.
fun <T> cast(any: Any, clazz: KClass<*>): T = clazz.java.cast(any)
cast(0, Int::class)
Run Code Online (Sandbox Code Playgroud)
但是,我收到了这个错误.
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)
Run Code Online (Sandbox Code Playgroud)
因为参数的类型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)
Run Code Online (Sandbox Code Playgroud)