次のJavaクラス:
public class SomeClass {
public interface Something {
void doSomething();
}
public void call(Something something) {}
}
Kotlinでは、ラムダ式を次のように使用できます。
SomeClass().call {
// do something
}
しかし、Kotlinで(同じインターフェースを使用して)次のメソッドを定義すると、次のようになります。
fun call(something: Something) {}
次に、この呼び出し:
call {
// do something
}
型の不一致エラーが発生します。どうして?
Kotlin自体には関数型があるため、KotlinはJavaメソッドのSAM変換のみをサポートします。通常、Kotlin関数はSomething
ではなく() -> Unit
を使用する必要があります。本当に必要な場合Something
を取るには、SAMコンストラクターを使用できます。
call(Something { /* do something */ })
すべてのSAMタイプ(1つの抽象メソッドを持つJavaインターフェイス)は、ラムダをそのインスタンスに変換するようなコンストラクター関数を自動的に取得します。
Kotlinでは、呼び出しにsomething
インターフェイスが必要です。
() -> Kotlin.Unit
タイプ要件を満たしていません。
あなたはこれを行うことができます
call (object : Something {
override fun doSomething() {
println("Passing an interface to call in kotlin!")
}
})