有没有办法将Kotlin的String :: startsWith传递给采用Java的String :: startsWith的方法?

时间:2018-08-16 19:49:44

标签: java kotlin

我有一个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或其他东西?

2 个答案:

答案 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) }