Kotlin 中如何通过反射判断一个类是否为泛型

问题描述 投票:0回答:1

假设我们有以下课程:

  data class KeyValuePair<T : Any>(
      val key: String,
      val value: T
  )

如果我们反思这个类的以下实例:

KeyValuePair("color", "amber")
,第一个属性当然是
kotlin.String
,但第二个属性的类型名称为T。是否有一种编程方法来确定这个
KProperty1
是通用的?除了诸如“类名不包含点”之类的黑客行为。

kotlin generics reflection
1个回答
0
投票

您可以使用以下方式获取属性的类型:

val props = KeyValuePair::class.declaredMemberProperties.first { it.name == "value" }
val returnType = props.returnType

这将为您返回一个代表

KType
T
实例。但是,可能在某处定义了
class T
,并且您不知道
T
是泛型类型还是实际类。此外,泛型类型可以有任何名称。

鉴于成员属性中的

T
与定义为类的通用类型的
T
相同,我认为回答您的问题的一种方法是:

  1. 提取类的泛型类型(也称为类型参数)列表
  2. 检查属性的返回类型是否属于该列表

示例:

fun main() {
    val classTypeParams = KeyValuePair::class.typeParameters

    val props = KeyValuePair::class.declaredMemberProperties.first { it.name == "value" }
    val returnType = props.returnType
    println(returnType.classifier in classTypeParams) // prints true
}

如果你想对函数做同样的事情,事情会变得有点复杂,因为:

  • 函数有输入和输出类型,所以你需要看2个地方-
  • 函数可以定义自己的泛型类型(例如
    fun <T> foo(): T
© www.soinside.com 2019 - 2024. All rights reserved.