Ich habe das getan:
%Vor%und bekomme diese Ausnahme:
inkompatible Typen: Intf ist keine funktionale Schnittstelle Mehrere nicht überschreibende abstrakte Methoden gefunden in Interface Intf Hinweis: Einige Nachrichten wurden vereinfacht. kompilieren Sie mit -Xdiags: worum es geht volle Ausgabe 1 Fehler
Gibt es eine Bedingung, dass ich Lambda nicht verwenden kann, um anonyme Klasse zu ersetzen?
Nein. Es gibt keine Möglichkeit, dies zu "überwinden". Eine funktionale Schnittstelle muss nur eine abstrakte Methode haben. Ihre Schnittstelle hat zwei:
%Vor% Hinweis: Sie müssen Ihre Benutzeroberfläche nicht wie in den Kommentaren erwähnt kommentieren. Sie können jedoch die Annotation @FunctionalInterface
verwenden, um Fehler bei der Kompilierung zu erhalten, wenn Ihre Schnittstelle keine gültige funktionale Schnittstelle ist. So bringt es Ihnen ein bisschen mehr Sicherheit in Ihrem Code.
Für mehr siehe z.B. Ссылка
Nur als Referenz und um die bereits gegebenen Antworten zu bereichern:
Laut JSR-335: Lambda-Ausdrücke für die Programmiersprache Java , im Abschnitt Lambda Spezifikation, Teil A: Funktionale Schnittstellen heißt es:
Eine funktionale Schnittstelle ist eine Schnittstelle, die nur eine Zusammenfassung hat Methode (neben den Methoden von Object), und stellt somit ein Einzelfunktionsvertrag. (In einigen Fällen kann diese "single" -Methode nehmen Sie die Form von mehreren abstrakten Methoden mit Override-Äquivalent von Superschnittstellen geerbte Signaturen; in diesem Fall das geerbte Methoden repräsentieren logisch eine einzige Methode.)
Sie müssen also entweder eine Standardimplementierung für eine Ihrer Methoden bereitstellen oder eine Ihrer Methoden in eine andere Schnittstelle einfügen.
Denken Sie darüber nach:
Wie sollte der Compiler wissen, ob Sie get1
oder get2
? überschreiben wollen?
Wenn Sie get1
nur überschreiben, was wird get2
implementiert? Selbst der Code, den Sie auskommentiert haben, funktioniert nicht, weil Sie get2
... nicht implementieren.
Es gibt Gründe für diese Einschränkung ...
Wie von Thomas-Uhrig angegeben, können funktionale Interfaces nur eine Methode haben.
Eine Möglichkeit, dies zu beheben, besteht hauptsächlich darin, dass Sie public T get2(T arg1);
nie verwenden, um die Schnittstelle Intf<T>
zu ändern:
Tags und Links java java-8 lambda functional-interface