2016-01-20 17 views
6

Data una semplice interfaccia con un metodo di default:override un metodo predefinito utilizzando lambda

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

e un metodo che accetta un'istanza di esso:

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

posso ignorare questa usando una classe anonima :

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

ma se provo con un lambda print(() -> System.out.println("OverHello2"));, ottengo un errore di compilazione.

Nessun metodo di destinazione trovato

C'è un modo per rendere la sostituzione con un lambda?

+1

Puoi pubblicare l'interfaccia 'A', per favore? – RAnders00

+0

interfaccia privata A {default void hello() {System.out.println ("A");}} – T4l0n

+0

puoi pubblicare un errore? – user902383

risposta

7

No, perché l'interfaccia non ha esattamente un metodo non implementato (che un lambda potrebbe fornire per l'implementazione).

Vedere @FunctionalInterface.

0

Lambdas non consente l'override dei metodi predefiniti. Questa è stata una scelta progettuale intenzionale in quanto consente interfacce funzionali (interfacce che possono essere istanziate tramite un lambda) per avere uno o più metodi predefiniti.

Per consentire a A di essere istanziato tramite un lambda, non è possibile avere una definizione predefinita per hello().