2016-01-20 16 views
6

Biorąc prosty interfejs z domyślną metodę:Zastąp domyślną metodę używając lambdy

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

i sposobu, który akceptuje instancję nim:

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

mogę zastąpić to używając anonimową klasę :

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

ale gdy próbuję z lambda print(() -> System.out.println("OverHello2"));, pojawia się błąd kompilacji.

Nie sposób znaleźć cel

Czy istnieje sposób, aby nadpisanie z lambda?

+1

Czy możesz opublikować interfejs "A"? – RAnders00

+0

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

+0

Czy możesz zgłosić błąd, który masz? – user902383

Odpowiedz

7

Nie, ponieważ twój interfejs nie ma dokładnie jednej niezaimplementowanej metody (że lambda może zapewnić implementację).

Zobacz @FunctionalInterface.

0

Lambdas nie pozwalają na nadpisywanie domyślnych metod. Był to celowy wybór projektu, ponieważ umożliwia funkcjonalne interfejsy (interfejsy, które mogą być tworzone za pomocą lambda), aby mieć jedną lub więcej domyślnych metod.

Aby pomyślnie zezwolić na wykonanie instancji za pomocą lambda, nie można ustawić domyślnej definicji dla hello().

Powiązane problemy