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:
1 | public interface ClassA { |
3 | System.out.println( "this is ClassA" ); |
6 | public interface ClassB{ |
8 | System.out.println( "this is ClassB" ); |
11 | public class ClassImplementer implements ClassA, ClassB { |
Metoda boo() z ClassA jest ustawiona jako domyślna brak takiej deklaracji spowoduje rzucenie wyjątku widocznego powyżej.
1 | public class ClassTest { |
3 | public static void main(String[] args) { |
5 | ClassA classA = new ClassImplementer(); |
8 | ClassB classB = new ClassB() { |
11 | System.out.println( "this is Override ClassB" ); |
16 | ClassImplementer classImplementer = new ClassImplementer(); |
17 | classImplementer.boo(); |
Output:
this is ClassA
this is Override ClassB
this is ClassA