我想要一个对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
}
答案 0 :(得分:3)
Dog::age
是一个值(类型为KProperty1<Dog, String>
),而不是类型。在<
和>
之间,您需要放置一个类型,或者您需要完全省略它们,然后将推断出该类型(这是在前两行中发生的情况)。
因此,与您的fun
等效的是
class ReflectionHelper<P: KProperty1<*, *>>(input: P) { ... }
val helper2 = ReflectionHelper(Dog::age)
如果不需要input: P
作为参数,则必须同时为P
和fun
指定class
。