2016-01-20 25 views
6

Bei einer einfachen Schnittstelle mit einer Standardmethode:eine Standard-Methode außer Kraft setzen lambdas

private interface A { 
    default void hello() { 
     System.out.println("A"); 
    } 
} 

Und eine Methode, die eine Instanz davon akzeptiert:

private static void print(A a) { 
    a.hello(); 
} 

ich diese mit einer anonymen Klasse außer Kraft setzen können :

print(new A() { 
    @Override 
     public void hello() { 
     System.out.println("OverHello"); 
    } 
}); 

aber wenn ich mit einem Lambda-print(() -> System.out.println("OverHello2")); versuchen, erhalte ich einen Kompilierungsfehler.

kein Ziel Methode gefunden

Gibt es eine Möglichkeit, die Überschreibung mit einem Lambda zu machen?

+1

Können Sie die 'A'-Schnittstelle bitte posten? – RAnders00

+0

private Schnittstelle A {default void hallo() {System.out.println ("A");}} – T4l0n

+0

können Sie einen Fehler posten, den Sie haben? – user902383

Antwort

7

Nein, weil Ihre Schnittstelle nicht genau eine nicht implementierte Methode hat (für die ein Lambda die Implementierung bereitstellen könnte).

Siehe @FunctionalInterface.

0

Lambdas erlauben keine Überschreibung von Standardmethoden. Dies war eine bewusste Design-Entscheidung, da es funktionalen Schnittstellen (Schnittstellen, die über ein Lambda instanziiert werden können) ermöglicht, eine oder mehrere Standardmethoden zu verwenden.

Damit A über ein Lambda instanziiert werden kann, kann keine Standarddefinition für hello() definiert werden.

Verwandte Themen