在Kotlin动态演员

mmo*_*iro 6 java casting kotlin

我想投AnyIntKClass<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吗?

Kir*_*man 5

尝试将代码更改为

fun <T: Any> cast(any: Any, clazz: KClass<out T>): T = clazz.javaObjectType.cast(any) 
Run Code Online (Sandbox Code Playgroud)

说明

因为参数的类型anyAny,它始终是引用类型,并且基元将被加框.对于第二个参数,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)