web-dev-qa-db-ja.com

Kotlinでのラムダ式

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

型の不一致エラーが発生します。どうして?

27
cdroid

Kotlin自体には関数型があるため、KotlinはJavaメソッドのSAM変換のみをサポートします。通常、Kotlin関数はSomethingではなく() -> Unitを使用する必要があります。本当に必要な場合Somethingを取るには、SAMコンストラクターを使用できます。

call(Something { /* do something */ })

すべてのSAMタイプ(1つの抽象メソッドを持つJavaインターフェイス)は、ラムダをそのインスタンスに変換するようなコンストラクター関数を自動的に取得します。

27
Andrey Breslav

Kotlinでは、呼び出しにsomethingインターフェイスが必要です。

() -> Kotlin.Unit

タイプ要件を満たしていません。

あなたはこれを行うことができます

call (object : Something {
    override fun doSomething() {
        println("Passing an interface to call in kotlin!")
    }
})
10
Jakob Bowyer