w , ,

Wielodziedziczenie Java

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:

1public interface ClassA {
2 default void boo() {
3 System.out.println("this is ClassA");
4 }
5}
6public interface ClassB{
7 default void boo() {
8 System.out.println("this is ClassB");
9 }
10}
11public class ClassImplementer implements ClassA, ClassB {
12 
13@Override
14 public void boo() {
15 ClassA.super.boo();
16 }
17}

Metoda boo() z ClassA jest ustawiona jako domyślna brak takiej deklaracji spowoduje rzucenie wyjątku widocznego powyżej.

1public class ClassTest {
2 
3public static void main(String[] args) {
4 
5ClassA classA = new ClassImplementer();
6classA.boo();
7 
8ClassB classB = new ClassB() {
9@Override
10public void boo() {
11System.out.println("this is Override ClassB");
12}
13};
14classB.boo();
15 
16ClassImplementer classImplementer = new ClassImplementer();
17classImplementer.boo();
18}
19}

Output:
this is ClassA
this is Override ClassB
this is ClassA

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

Wyrażenie lambda w Java

Sikuli – zgrabne narzędzie dla automatyzacji zadań