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:

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

Napisane przez Przemysław Bykowski

Przemysław Bykowski, inżynier oprogramowania

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Ładowanie…

Wyrażenie lambda w Java

Sikuli – zgrabne narzędzie dla automatyzacji zadań