Lambda kann nur verwendet werden, mit funktionalen Schnittstelle?
Habe ich dieses:
public class LambdaConflict
{
public static void main(String args[]){
//*
System.out.println(LambdaConflict.get(
(str) -> "Hello World!! By ME?"
));
/*/
System.out.println(LambdaConflict.get(new Intf<String> (){
@Override public String get1(String str){
return "Hello World!! By get1 " + str;
}
}));
/*****/
}
public static String get(Intf<String> i, boolean b){
return i.get1("from 1");
}
}
interface Intf<T>
{
public T get1(T arg1);
public T get2(T arg1);
}
bekommen und diese Ausnahme:
inkompatible Typen: Intf ist nicht eine funktionale Schnittstelle
mehrere nicht-überschreiben der abstrakten Methoden in das interface Intf
Hinweis: Einige Nachrichten wurden vereinfacht; recompile with-Xdiags:ausführlich zu bekommen
vollständige Ausgabe
1 Fehler
Gibt es eine Bedingung, die ich nicht verwenden kann, lambda zu ersetzen anonymen Klasse?
- Was meinst du mit überwindung? Verstehst du den Fehler?
- 1) Funktionale Schnittstellen müssen nur 1 Methode. 2) Sie muss annotiert werden @FunctionalInterface
- Fuctional-Schnittstellen sind auch als SAM-Typen (Single Abstract Method-Typen). So, können Sie nur einen einzigen abstrakten Methode in einem functional interface.
- Ich denke, der Punkt 2 ist nicht gültig. Sie können kommentiert werden, ist aber nicht erforderlich.
- Der Punkt über die annotation. Würde nicht machen, dass bereits vorhandene Schnittstellen wie
Runnable
nicht-funktional? - Interessant, du hast Recht. "Sollten kommentiert werden
@FunctionalInterface
" in diesem Fall - Ich denke, dies kann überwunden werden durch die Schaffung einer anderen (übergeordneten?) Schnittstelle oder durch die Zusammensetzung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Es gibt keine Möglichkeit zu "überwinden" dieser. Eine funktionale Schnittstelle muss nur eine abstrakte Methode. Dein interface hat zwei:
Hinweis: Sie brauchen nicht zu kommentieren Ihre Schnittstelle wie bereits erwähnt in den Kommentaren. Aber Sie können den
@FunctionalInterface
Kommentar zu bekommen compile-Zeit-Fehler auf, wenn Ihre Schnittstelle ist keine gültige funktionale Schnittstelle. So bringt es Ihnen ein wenig mehr Sicherheit in Ihrem code.Mehr siehe z.B. http://java.dzone.com/articles/introduction-functional-1
@FunctionalInterface
! Ich vergessen, es hat spezielle Eigenschaften. Auch fand ich ein Upgrade auf die neueste JDK8-patch von Oracle hilft auch zur Verbesserung der Fehlermeldungen. Ältere Versionen von JDK8 kann es manchmal zu obigen code kompilieren, aber nicht mit einemjava.lang.AbstractMethodError
zur Laufzeit. Neuere Versionen ablehnen wird zur compile-Zeit.Nur für Referenz-und bereichern die bereits gegebenen Antworten:
Als pro JSR-335: Lambda-Ausdrücke für die Programmiersprache Java, in Abschnitt Lambda-Spezifikation, Teil A: Funktionale Schnittstellen, die es sagt:
So, was Sie brauchen, ist entweder eine default-Implementierung für eine Ihrer Methoden, oder setzen Sie eine Ihrer Methoden in einer anderen Schnittstelle.
Denken Sie daran:
Wie soll der compiler wissen, ob Sie überschreiben möchten
get1
oderget2
?Wenn Sie nur überschreiben
get1
, wasget2
's Umsetzung? Auch der code, den Sie auskommentiert wird nicht funktionieren weil Sie nicht implementiertget2
...Gibt es Gründe für diese Beschränkung...
Wie bereits von @Thomas-Uhrig, Funktionale Schnittstellen, die nur eine Methode.
Einen Weg, um dieses Problem zu lösen, vor allem, weil Sie nie verwenden
public T get2(T arg1);
ist, ändern Sie dieIntf<T>
Schnittstelle: