gpt4 book ai didi

java - 如何使用 lambda 调用具有多个相似签名的 Kotlin 方法?

转载 作者:行者123 更新时间:2023-11-30 06:47:43 25 4
gpt4 key购买 nike

我正在使用此库中的一些代码:https://github.com/Netflix-Skunkworks/rewrite

当我调用其方法之一时,遇到 IDE 错误:

None of the following functions can be called with the arguments supplied.

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

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

Kotlin 中的调用代码:

val unit: CompilationUnit =...
unit.refactor{ tx ->
doSomeThing()
}

在 Java 中使用 lambda 进行调用是可以的:

CompilationUnit unit = ....
unit.refactor(tx -> {
doSomeThing()
});

最佳答案

您可以修复 Kotlin 中的调用代码:您正在传递带有一个参数的 lambda { tx -> doSomething() } ,但是那里应该有一个带有接收器且没有参数的 lambda。

比较:(Refactor) -> Unittype for a function有一个参数,而 Refactor.() -> Unit表示 function with receiver ,它不接受任何参数,而是传递一个 this 类型的接收者 ( Refactor ) 。这些类型有时可以互换,但 lambda 不会在它们之间隐式转换。

所以,您可以调用refactor如下:

val unit: CompilationUnit = ...
unit.refactor {
doSomeThing() // this code can also work with `this` of type `Refactor`
}

或者,使用 Consumer<Refactor> 调用重载,您可以明确指定:

unit.refactor(Consumer { tx -> doSomething() })

隐式SAM conversion显然,这是不可用的,因为有几个函数参数的重载。

关于java - 如何使用 lambda 调用具有多个相似签名的 Kotlin 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43389783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com