我正在对Kotlin的反射进行一些实验。
我试图使用其参数获取通用类的反射对象。
在Java中,这将是一个 ParameterizedType
。
使用Java的反射API获取此类东西的方法有点复杂:创建通用类的匿名子类,然后首先获取其超类型第一个参数。
以下是示例:
@Suppress("unused") @PublishedApi
internal abstract class TypeReference<T> {}
inline fun <reified T> jGeneric() =
((object : TypeReference<T>() {}).javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
当我使用
println(jGeneric<List<String?>>())
时,它会打印出java.util.List<? extends java.lang.String>
,这是合理的,考虑到Kotlin的List
使用声明处out
变型且Java类型没有空值的概念。现在,我想使用Kotlin反射API来实现同样的结果(当然,它将包含空置信息)。
当然,
List<String>::class
无法工作,因为它产生了一个KClass
,而我正在寻找一个KType
。然而,当我尝试这样做:
inline fun <reified T> kGeneric() =
(object : TypeReference<T>() {})::class.supertypes[0].arguments[0].type
当我打印
println(kGeneric<List<String?>>())
时,它会输出 [ERROR : Unknown type parameter 0]
,这感觉有点...反高潮 ;)
在Kotlin中,如何获得反映 List<String>
的 KType
?
[ERROR : ...]
"这部分是toString
方法实现中的一个错误:https://youtrack.jetbrains.com/issue/KT-17103 - Alexander Udalov