Kotlin 科特林';s反射:未知类型参数

Kotlin 科特林';s反射:未知类型参数,kotlin,kotlin-reflect,Kotlin,Kotlin Reflect,我正在对科特林的反射进行一些实验 我试图获得一个泛型类的反射对象及其参数 在Java中,这将是一个参数化类型 使用Java的反射API获得这样一个东西的方法有点复杂:创建一个泛型类的匿名子类,然后首先获取它的超类型参数 下面是一个例子: @Suppress("unused") @PublishedApi internal abstract class TypeReference<T> {} inline fun <reified T> jGeneric() =

我正在对科特林的反射进行一些实验

我试图获得一个泛型类的反射对象及其参数

在Java中,这将是一个
参数化类型

使用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(kGeneric())
时,它会打印
[错误:未知类型参数0]
,这非常。。。嗯,虎头蛇尾;)


如何在Kotlin中获得反映列表的
KType

要在Kotlin 1.1中创建
KType
实例,您有两个选项:

  • 若要从
    KClass
    中创建简单的不可为空类型,其中该类不是泛型的,或者您可以用星形投影替换其所有类型参数(
    *
    ),请使用
    starProjectedType
    属性。例如,下面创建一个
    KType
    ,表示不可为空的类型
    字符串

    val nonNullStringType = String::class.starProjectedType
    
    或者,下面创建一个
    KType
    ,表示不可为空的类型
    列表

  • 对于更复杂的情况,请使用
    createType
    函数。它接受类、类型参数以及类型是否应为null。类型参数是
    KTypeProjection
    的列表,它只是一个类型+方差(in/out/none)。例如,以下代码创建了一个表示
    列表的
    KType
    实例:

    或者,下面创建类型
    列表?

kotlin.reflect.full
中定义了
starProjectedType
createType


介绍了仅从内联函数的具体化类型参数获取
KType
实例的可能性,这在静态已知所需类型的某些情况下会有所帮助,但目前还不完全清楚在没有重大开销的情况下是否有可能。因此,在实现之前,请使用上面解释的声明。

toString
实现中,“
[错误:…]
”部分是一个bug:不幸的是,这个答案强制手动创建类型,这使得它无法用于库。我会关注你链接的问题。。。谢谢;)我认为在1.1中也不能在所有情况下使用上述类型的创建,有些方面没有实现<代码>默认类型
仍然需要解决这些错误。也许@udalov可以对正在解决的问题发表评论。@JaysonMinard您具体指的是什么错误和方面?
val nonNullStringType = String::class.starProjectedType
val nonNullListOfSmth = List::class.starProjectedType
val nonNullStringType = String::class.starProjectedType
val projection = KTypeProjection.invariant(nonNullStringType)
val listOfStrings = listClass.createType(listOf(projection))
val listOfStrings = listClass.createType(listOf(projection), nullable = true)