Lambda kann nur mit funktionaler Schnittstelle verwendet werden?

7

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?

    
Valen 15.05.2014, 15:12
quelle

4 Antworten

15

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. Ссылка

    
Thomas Uhrig 15.05.2014 15:16
quelle
6

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.

    
Edwin Dalorzo 15.05.2014 15:23
quelle
1

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 ...

    
Idan Arye 15.05.2014 15:18
quelle
0

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:

%Vor%     
DirkyJerky 15.05.2014 15:19
quelle