我有一个Java方法带有一个类型的参数
interface Function2<TP1, TP2, TR> {
TR apply(TP1 p1, TP2 p2)
}
和类似的Java方法
boolean containsMatch(String[] sa, String s, Function2<String, String, boolean> compare) {
...
}
在我的Java代码中,我可以调用containsMatch
并将String::startsWith
作为compare
参数传递。
当我尝试从我的Kotlin代码进行调用时,似乎没有String::startsWith
的任何重载,该重载仅需要一个参数。有什么方法可以让编译器使用带有默认参数值的重载之一,还是我需要传递lambda或其他东西?
答案 0 :(得分:2)
您只需将Kotlin lambda传递给它,它应该可以正常工作...
containsMatch(arrayOf("A", "B", "C"), "A", { a, b -> a.startsWith(b) })
// Or this, which is a more idiomatc way of typing it.
containsMatch(arrayOf("A", "B", "C"), "A") { a, b -> a.startsWith(b) }
答案 1 :(得分:2)
在没有指定所有参数的情况下,无法从Java调用具有默认参数的Kotlin函数,因为Java不知道默认参数的概念。有@JvmOverloads
注释会创建多个重载来模拟Java中的Kotlin行为。
关于您的问题,方法引用也是如此,这就是为什么您不能简单地传递String::startsWith
的原因。但是,您可以通过闭包{ a, b -> a.startsWith(b) }