この質問はすでにどこかにあると思いますが、見つけることができませんでした。
ラムダを操作するために機能的なインターフェイスが必要な理由がわかりません。次の例を検討してください。
public class Test {
public static void main(String...args) {
TestInterface i = () -> System.out.println("Hans");
// i = (String a) -> System.out.println(a);
i.hans();
// i.hans("Hello");
}
}
public interface TestInterface {
public void hans();
// public void hans(String a);
}
これは問題なく動作しますが、コメント行のコメントを外すと、動作しません。なんで?私の理解では、コンパイラは2つのメソッドを区別できるはずです.2つのメソッドは異なる入力パラメータを持っているからです. 機能的なインターフェイスが必要で、コードを爆破するのはなぜですか?
編集:リンクされた重複は、異なるメソッドパラメーターについて尋ねているため、私の質問に答えませんでした。しかし、助けてくれたみんなに感謝します! :)
EDIT2:申し訳ありませんが、私は明らかにネイティブスピーカーではありませんが、正確には:
public interface TestInterface {
public void hans(); //has no input parameters</br>
public void hans(String a); //has 1 input parameter, type String</br>
public void hans(String a, int b); //has 2 input parameters, 1. type = String, 2. type = int</br>
public void hans(int a, int b); //has also 2 input parameters, but not the same and a different order than `hans(String a, int a);`, so you could distinguish both
}
public class Test {
public static void main(String...args) {
TestInterface i = () -> System.out.println("Hans");
i = (String a) -> System.out.println(a);
i = (String a, int b) -> System.out.println(a + b);
i = (int a, int b) -> System.out.println(a);
i.hans(2, 3); //Which method would be called? Of course the one that would take 2 integer arguments. :)
}
}
私が求めているのは、議論についてだけです。メソッド名は問題ではありませんが、各メソッドは異なる引数の一意の順序をとります。そのため、Oracle は、「Lambda-Interface」ごとに単一のメソッドを可能にする代わりに、この機能を実装できたはずです。