Ich tauche derzeit tiefer in Java 8
Features wie Lambdas und Methodenreferenzen. Spielen um ein bisschen brachte mich auf das folgende Beispiel:Warum kompiliert diese Java 8 Methodenreferenz?
public class ConsumerTest {
private static final String[] NAMES = {"Tony", "Bruce", "Steve", "Thor"};
public static void main(String[] args) {
Arrays.asList(NAMES).forEach(Objects::requireNonNull);
}
}
Meine Frage ist:
Warum wird die Linie in der Hauptmethode kompilieren?
Wenn ich die Sache richtig verstanden habe, muss die Signatur der referenzierten Methode der SAM-Signatur der funktionalen Schnittstelle entsprechen. In diesem Fall benötigt der Verbraucher die folgende Signatur:
void accept(T t);
jedoch die requireNonNull
Methode gibt T
statt Leere:
public static <T> T requireNonNull(T obj)
Betrachte 'myList.forEach (myOtherList :: add)'. Ist es dir egal, dass 'List.add' 'boolean' zurückgibt, was immer 'wahr' ist? Es wäre ein Schmerz, wenn 'myOtherList :: add' nicht funktioniert. –