Java 如何使用lambda调用具有多个类似签名的Kotlin方法?
我正在使用此库中的一些代码: 调用其中一个方法时,我遇到一个IDE错误: 使用提供的参数无法调用以下函数 目标方法有两个相似的签名:Java 如何使用lambda调用具有多个类似签名的Kotlin方法?,java,kotlin,higher-order-functions,overload-resolution,Java,Kotlin,Higher Order Functions,Overload Resolution,我正在使用此库中的一些代码: 调用其中一个方法时,我遇到一个IDE错误: 使用提供的参数无法调用以下函数 目标方法有两个相似的签名: data class CompilationUnit(...){ fun refactor() = Refactor(this) fun refactor(ops: Refactor.() -> Unit): Refactor { val r = refactor() ops(r) retu
data class CompilationUnit(...){
fun refactor() = Refactor(this)
fun refactor(ops: Refactor.() -> Unit): Refactor {
val r = refactor()
ops(r)
return r
}
fun refactor(ops: Consumer<Refactor>): Refactor {
val r = refactor()
ops.accept(r)
return r
}
}
在Java中,使用lambda调用是可以的:
CompilationUnit unit = ....
unit.refactor(tx -> {
doSomeThing()
});
您可以修复Kotlin中的调用代码:您正在传递一个带有一个参数的lambda
{tx->doSomething()}
,但是一个带有receiver且不需要参数的lambda
比较:(Refactor)->Unit
是带有一个参数的,而Refactor(->)Unit
表示a,它不带参数,而是传递一个Refactor
类型的接收器(this
)。这些类型有时是可互换的,但lambda不会在它们之间进行隐式转换
因此,您可以按如下方式调用refactor
it:
val unit: CompilationUnit = ...
unit.refactor {
doSomeThing() // this code can also work with `this` of type `Refactor`
}
或者,要使用消费者
调用重载,可以明确指定:
unit.refactor(Consumer { tx -> doSomething() })
显然,Implicit不可用,因为存在多个带有函数参数的重载
unit.refactor(Consumer { tx -> doSomething() })