java - 如何区分 kotlin 中绑定(bind)的可调用成员引用和相同类型的函数?

标签 java android jvm kotlin

当涉及到方法签名或定义时,有什么方法可以区分

users().indexOn(User::id)

users().indexOn<User, String> { it.id() }

?也就是说,指定需要绑定(bind)成员引用而不是函数实例,反之亦然。这是上面示例的签名:

fun <T: SomeType, U> indexOn(function: (T) -> U): List<U>

同样,是否可以区分构造函数引用和仅返回类型的函数?例如。 query(::SomeLookup)query { SomeLookup(args) } (如果可能,不使用 kotlin.reflect)

最佳答案

在类型系统中区分 lambda 和函数引用的一种方法是使用反射接口(interface) 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 是否存在。的KFunction<*>为空。

关于java - 如何区分 kotlin 中绑定(bind)的可调用成员引用和相同类型的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45756705/

相关文章:

java - 直接分配给老年代的巨大对象的大小

java - Spring Bean 初始化顺序

java - 如何知道 firebase ChildEventListener 是否找到了 child ? [安卓]

android - React native firebase - android无法构建

android - Unity 要求我定位我的 Android SDK

java - 带线程的异步函数

java - 从 JNI 声明函数

java - Calendar.getTime() 中奇怪的 IllegalArgumentException

java - 数据库的对象映射 JPA/openEJB

java - 扫描我的二维码后即可进行下一个 Activity