Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用lambda调用具有多个类似签名的Kotlin方法?_Java_Kotlin_Higher Order Functions_Overload Resolution - Fatal编程技术网

Java 如何使用lambda调用具有多个类似签名的Kotlin方法?

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

我正在使用此库中的一些代码:

调用其中一个方法时,我遇到一个IDE错误:

使用提供的参数无法调用以下函数

目标方法有两个相似的签名:

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() })