Wraz z nadejściem Java 8 pojawiła się nowa koncepcja implementacji Interfejsów. Teraz programista będzie miał możliwość zaimplementowania domyślnej obsługi metody w każdej metodzie interfejsu.
Pierwsza myśl jaka się nasuwa to powrót do korzeni języków obiektowych, które wspierają Multiple inheritance.
Jednak w Javie zostało to rozwiązane w bardzo przejrzysty sposób. W przypadku kiedy klasa implementuje dwa interfejsy, które mają metodę o tej samej sygnaturze, to kompilator zwróci nam wyjątek:
error: class ClassImplementer inherits unrelated defaults for boo() from types ClassA and ClassB
Dość intuicyjne jest, aby w takim przypadku wskazać kompilatorowi, która metoda, ma zostać domyślną.
Poniżej demonstracja kilku użytecznych przypadków:
public interface ClassA {
default void boo() {
System.out.println("this is ClassA");
}
}
public interface ClassB{
default void boo() {
System.out.println("this is ClassB");
}
}
public class ClassImplementer implements ClassA, ClassB {
@Override
public void boo() {
ClassA.super.boo();
}
}Metoda boo() z ClassA jest ustawiona jako domyślna brak takiej deklaracji spowoduje rzucenie wyjątku widocznego powyżej.
public class ClassTest {
public static void main(String[] args) {
ClassA classA = new ClassImplementer();
classA.boo();
ClassB classB = new ClassB() {
@Override
public void boo() {
System.out.println("this is Override ClassB");
}
};
classB.boo();
ClassImplementer classImplementer = new ClassImplementer();
classImplementer.boo();
}
}Output:
this is ClassA
this is Override ClassB
this is ClassA
Zobacz listę szkoleń


