この質問はすでにどこかにあると思いますが、私はそれを見つけることができませんでした。lambdaを使用するために機能的なインターフェイスが必要なのはなぜですか?
それはラムダと連携するための機能のインタフェースを持つことが必要だ、なぜ私は、理解していません。次の例を考えてみましょう:
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);
}
これは問題なく動作しますが、コメント行のコメントを外すと、これは実行されません。どうして?私の理解では、コンパイラは異なる入力パラメータを持っているので、両方のメソッドを区別することができます。なぜ機能的なインターフェイスが必要なのですか?
編集:私は別のメソッドパラメータについて求めているので、リンク重複は私の質問に答えませんでした。しかし、助けてくれた皆さんのおかげで、本当に便利な答えが得られました! :)
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」ごとに単一のメソッドを作成できるだけでなく、この機能を実装できます。
'int i = 7; i = 5; System.out.println(i); //これが7と5の両方を出力するのであれば、すばらしいとは思いませんか? ' – immibis
あなたの推論は本当に分かりません。何かがインターフェースを実装していない場合、そのタイプはどのようになりますか?あなたが電話をしていないという理由だけで、iPodはiPhoneとしてカウントされません。 – zeroflagL
@immibis:ここで説明する内容は、私が尋ねた内容とは異なります。 :) – codepleb