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.

InformationsquelleAutor Valen | 2014-05-15
Schreibe einen Kommentar