Myślę, że to pytanie jest już gdzieś tam, ale nie byłem w stanie go znaleźć.Dlaczego potrzebuję funkcjonalnego interfejsu do pracy z lambdami?
Nie rozumiem, dlaczego konieczne jest posiadanie funkcjonalnego interfejsu do pracy z lambdami. Rozważmy następujący przykład:
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);
}
To działa bezproblemowo, ale jeśli odkomentujesz skomentowane linie, to nie. Czemu? W moim rozumieniu, kompilator powinien być w stanie odróżnić obie metody, ponieważ mają różne parametry wejściowe. Dlaczego potrzebuję funkcjonalnego interfejsu i wysadzić mój kod?
EDYCJA: Połączone duplikaty nie odpowiedziały na moje pytanie, ponieważ pytam o różne parametry metody. Ale dostałem tutaj kilka naprawdę użytecznych odpowiedzi, dzięki wszystkim, którzy pomogli! :)
EDIT2: Niestety, jestem oczywiście nie native speaker, ale precyzyjny siebie:
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. :)
}
}
Wszystko pytam jest o argumentach. Nazwa metody nie ma znaczenia, ale każda z metod przyjmuje unikalną kolejność różnych argumentów iz tego powodu Oracle mogło zaimplementować tę funkcję, zamiast tego po prostu umożliwić pojedynczą metodę na "Lambda-Interface".
'int i = 7; i = 5; System.out.println (i); // nie byłoby wspaniale, gdyby wydrukowało to zarówno 7, jak i 5? ' – immibis
Naprawdę nie rozumiem twojego rozumowania. Jeśli coś nie implementuje interfejsu, to jak może być tego typu? IPod nie liczy się jako iPhone, tylko dlatego, że nie można wykonywać połączeń telefonicznych. – zeroflagL
@immibis: To, co tutaj opisujesz, różni się od tego, o co prosiłem. :) – codepleb