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