java - Kotlin 中的动态转换

标签 java casting kotlin

我想投 AnyInt通过使用 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/

相关文章:

Android Studio Gradle 构建非常慢

java - 下载文件之前通过套接字在客户端和服务器之间交换字符串

java - Spark : Read Iterate on 2 files

java - 如何在 Java 中进行 ping 操作并保存统计信息

c++ - 在运行时 C++ 中使用派生类

kotlin - 在Kotlin中存储String网格的最佳数据结构是什么?

java - 为什么 android HttpURLConnection 不发回 FIN?

java - 在java中将前导0字符串转换为整数

c++ - 将 float 转换为 int 时的奇怪行为

rx-java - 如何在没有 .flatMap 的情况下控制流,这会破坏 react 流,从而阻止 distinctUntilChanged 等运算符在整个流上工作