27

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

型の不一致エラーが発生します。なんで?

4

2 に答える 2

27

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

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

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

于 2014-10-23T02:28:48.677 に答える
10

Kotlin では、 call が interface の何かを取る必要がありますsomething

() -> Kotlin.Unit

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

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

call (object : Something {
    override fun doSomething() {
        println("Passing an interface to call in kotlin!")
    }
})
于 2014-10-22T21:00:56.263 に答える