我想投 Any
至Int
通过使用 KClass<Int>
,具有 KClass<Int>
和 Any
这实际上是 Int
.
fun <T> cast(any: Any, clazz: KClass<*>): T = clazz.java.cast(any)
cast(0, Int::class)
但是,我收到了这个错误。
java.lang.ClassCastException: Cannot cast java.lang.Integer to 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
将默认为 ìnt
而不是 整数
。通过使用 javaObjectType
,我们强制使用盒装引用类型。
另类
您还可以使用以下函数定义:
inline fun <reified T: Any> cast(any: Any): T = T::class.javaObjectType.cast(any)
// usage
cast<Int>(0)
关于java - Kotlin 中的动态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219748/