2017-04-13 60 views
1

我使用從庫中的部分代碼:https://github.com/Netflix-Skunkworks/rewrite如何用lambda調用多個類似簽名的Kotlin方法?

當我調用它的方法之一,我遇到一個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 
    } 
} 

在科特林調用代碼:

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

這與調用拉姆達是OK在Java中:

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

回答

1

您可以修復在科特林調用代碼:要傳遞一個lambda用一個參數{ tx -> doSomething() },但接收器的拉姆達,沒有爭吵,預計在那裏。

比較:(Refactor) -> Unittype for a function使用一個參數,而Refactor.() -> Unitfunction with receiver,它沒有參數,而是被傳遞Refactor類型的接收器(this)。這些類型有時可以互換,但lambdas不會在它們之間隱式轉換。

所以,你可以調用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是,顯然,不可用,因爲有幾個功能參數的重載。

相關問題