泛型函数有效,但泛型类不起作用吗?

时间:2018-09-30 13:28:20

标签: reflection kotlin kotlin-reflect

我想要一个对KProperty1通用的类,我可以为一个函数而不是一个类来做:

import kotlin.reflect.KProperty1

data class Dog(val name: String, val age: Int)

fun <P: KProperty1<*, *>> reflectionHelper(input: P) = input.name

fun <P: KProperty1<*, *>> getReflectionHelper(clazz: P) = ReflectionHelper<P>()

class ReflectionHelper<P: KProperty1<*, *>> {
}

fun main(args : Array<String>) {
    println(reflectionHelper(Dog::age))  // Works
    val helper1 = getReflectionHelper(Dog::age)  // Also Works
    val helper2 = ReflectionHelper<Dog::age>()  // Error: Type inference failed
}

1 个答案:

答案 0 :(得分:3)

Dog::age是一个值(类型为KProperty1<Dog, String>),而不是类型。在<>之间,您需要放置一个类型,或者您需要完全省略它们,然后将推断出该类型(这是在前两行中发生的情况)。

因此,与您的fun等效的是

class ReflectionHelper<P: KProperty1<*, *>>(input: P) { ... }
val helper2 = ReflectionHelper(Dog::age)

如果不需要input: P作为参数,则必须同时为Pfun指定class