通用函数有效,但通用 class 无效?
Generic function works, but generic class doesn't?
我想要一个 class 是 KProperty1
的泛型,我可以为一个函数做这个,但不是 class:
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
}
Dog::age
是一个值(KProperty1<Dog, String>
类型),而不是类型。在 <
和 >
之间你需要输入一个类型,或者你需要完全省略它们并且类型将被推断出来(这就是前两行中发生的事情)。
所以相当于你的 fun
是
class ReflectionHelper<P: KProperty1<*, *>>(input: P) { ... }
val helper2 = ReflectionHelper(Dog::age)
如果您不需要 input: P
作为参数,则必须为 fun
和 class
.[=20 明确指定 P
=]
我想要一个 class 是 KProperty1
的泛型,我可以为一个函数做这个,但不是 class:
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
}
Dog::age
是一个值(KProperty1<Dog, String>
类型),而不是类型。在 <
和 >
之间你需要输入一个类型,或者你需要完全省略它们并且类型将被推断出来(这就是前两行中发生的事情)。
所以相当于你的 fun
是
class ReflectionHelper<P: KProperty1<*, *>>(input: P) { ... }
val helper2 = ReflectionHelper(Dog::age)
如果您不需要 input: P
作为参数,则必须为 fun
和 class
.[=20 明确指定 P
=]