Kotlin中如何将Any类型转换为Class<T>或KClass<T>?
嘿,这个需求其实很容易实现!我们只需要给Any类型扩展两个castTo函数,分别适配KClass和Java的Class类型就行了,完全符合你想要的调用方式。
1. 实现针对KClass的扩展函数
我们可以借助KClass对应的Java Class来完成类型转换,代码如下:
fun <T> Any.castTo(kClass: KClass<T>): T { // 利用KClass的java属性拿到对应的Class对象,再调用cast方法 return kClass.java.cast(this) }
2. 实现针对Java Class的扩展函数
这个更直接,直接调用Java Class自带的cast方法即可:
fun <T> Any.castTo(javaClass: Class<T>): T { return javaClass.cast(this) }
完整使用示例
现在你就可以像你期望的那样调用了:
fun main() { val obj: Any = 123 val kotlinClass = Int::class val javaClass = Int::class.java val num: Int = obj.castTo(kotlinClass) val num2: Int = obj.castTo(javaClass) println(num) // 输出 123 println(num2) // 输出 123 }
额外补充:安全转换(避免抛出异常)
默认的cast方法和as转换一样,当类型不匹配时会抛出ClassCastException。如果想要更安全的转换(失败时返回null),可以扩展一个safeCastTo函数:
fun <T> Any.safeCastTo(kClass: KClass<T>): T? { return runCatching { kClass.java.cast(this) }.getOrNull() } fun <T> Any.safeCastTo(javaClass: Class<T>): T? { return runCatching { javaClass.cast(this) }.getOrNull() }
使用的时候就不用再担心异常了:
val wrongObj: Any = "not a number" val safeNum: Int? = wrongObj.safeCastTo(Int::class) println(safeNum) // 输出 null
内容的提问来源于stack exchange,提问作者Matthew Layton
相关产品推荐
相关产品推荐

