我正在对 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]
当 I 时println(jGeneric<List<String?>>())
,它会打印java.util.List<? extends java.lang.String>
,考虑到 KotlinList
使用声明站点out
差异并且 Java 类型没有可空性的概念,这是合乎逻辑的。
现在,我想使用 Kotlin 反射 API(当然,它包含可空性信息)来实现同样的结果。
当然,List<String>::class
不能工作,因为它会产生一个KClass
. 我正在寻找一个KType
.
但是,当我尝试这个时:
inline fun <reified T> kGeneric() =
(object : TypeReference<T>() {})::class.supertypes[0].arguments[0].type
当 I 时println(kGeneric<List<String?>>())
,它会打印出来[ERROR : Unknown type parameter 0]
,这非常......好吧,虎头蛇尾;)
在 Kotlin 中,我怎样才能得到一个KType
反射List<String>
?