2017-04-13 3 views
1

私はこのライブラリからいくつかのコードを使用しています:https://github.com/Netflix-Skunkworks/rewriteラムダで複数の同様のシグネチャでKotlinメソッドを呼び出すにはどうすればよいですか?

を、私はそのメソッドの1つを呼び出すと、私はIDEエラーが発生します。

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

ターゲットメソッドは、2人の類似の署名を持っています

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でOKです:

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

答えて

1

あなたはKotlinに呼び出し元のコードを修正することができます:あなたは一つの引数{ tx -> doSomething() }とラムダを渡しているが、受信機および引数のないラムダはそこに期待されています。

コンペア:Refactor.() -> Unitは引数を取らず、代わりにタイプRefactorの受信機(this)に渡されるfunction with receiverを意味し(Refactor) -> Unitは、一つの引数とtype for a functionあります。これらの型は互換性がありますが、ラムダは暗黙的に変換されません。

だから、あなたは次のように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は、明らかに、ではありません機能パラメータを持つ複数の過負荷があるために利用可能です。

関連する問題