假设我们有以下课程:
data class KeyValuePair<T : Any>(
val key: String,
val value: T
)
如果我们反思这个类的以下实例:
KeyValuePair("color", "amber")
,第一个属性当然是kotlin.String
,但第二个属性的类型名称为T。是否有一种编程方法来确定这个KProperty1
是通用的?除了诸如“类名不包含点”之类的黑客行为。
您可以使用以下方式获取属性的类型:
val props = KeyValuePair::class.declaredMemberProperties.first { it.name == "value" }
val returnType = props.returnType
这将为您返回一个代表
KType
的 T
实例。但是,可能在某处定义了 class T
,并且您不知道 T
是泛型类型还是实际类。此外,泛型类型可以有任何名称。
鉴于成员属性中的
T
与定义为类的通用类型的T
相同,我认为回答您的问题的一种方法是:
示例:
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
}
如果你想对函数做同样的事情,事情会变得有点复杂,因为:
fun <T> foo(): T
)