如何在kotlin中区分绑定的可调用成员引用和相同类型的函数?

时间:2017-08-18 12:30:38

标签: java android jvm kotlin

当谈到方法签名或定义时,有没有办法区分

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)

1 个答案:

答案 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}}是否为空。