当谈到方法签名或定义时,有没有办法区分
users().indexOn(User::id)
和
users().indexOn<User, String> { it.id() }
?也就是说,指定需要绑定成员引用而不是函数实例,反之亦然。以下是上述示例的签名:
fun <T: SomeType, U> indexOn(function: (T) -> U): List<U>
同样,是否可以区分构造函数引用和只返回类型的函数?例如。 query(::SomeLookup)
与query { SomeLookup(args) }
对比(如果可能,不使用kotlin.reflect)
答案 0 :(得分:4)
在类型系统中区分lambda和函数引用的一种方法是使用反射接口KFunction<T>
,例如:
fun <T> f(ref: T) where T : () -> Unit, T : KFunction<Unit> { /* ... */ }
fun g() { println("hello") }
f(::g) // OK
f { println("hello") } // Error: type parameter bound is not satisfied
虽然我现在无法让它反过来工作。
另外,我发现无法区分构造函数引用的类型。但是,在运行时,通过反射很容易做到这一点:您可以检查javaConstructor
的{{1}}是否为空。