我正在对Kotlin的反思进行一些实验 .
我试图通过其参数获得泛型类的反射对象 .
在Java中,那将是 ParameterizedType .
使用Java的反射API获取此类内容的方法有点复杂:创建泛型类的匿名子类,然后获取其超类型的第一个参数 .
这是一个例子:
@Suppress("unused") @PublishedApi
internal abstract class TypeReference {}
inline fun jGeneric() =
((object : TypeReference() {}).javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
当我 println(jGeneric>()) 时,它打印 java.util.List extends java.lang.String> ,这是合乎逻辑的,考虑到Kotlin的 List 使用声明站点 out 方差,并且Java类型没有可空性的概念 .
现在,我希望获得相同类型的结果,但使用Kotlin反射API(当然,它包含可空性信息) .
当然, List::class 无法工作,因为它产生 KClass . 我正在寻找 KType .
但是,当我尝试这个:
inline fun kGeneric() =
(object : TypeReference() {})::class.supertypes[0].arguments[0].type
当我 println(kGeneric>()) 时,会打印 [ERROR : Unknown type parameter 0] ,这很......很好,虎头蛇尾;)
我怎么能在Kotlin得到 KType 反映 List ?