在Kotlin动态演员

时间:2016-12-19 09:47:31

标签: java casting kotlin

我想使用AnyInt投放到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以外的任何解决方案吗?

2 个答案:

答案 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