Pascal4eg

 Java | Фишки и трюки

Множественная реализация интерфейсов с одинаковыми методами по умолчанию

interface Magician {
    default String getInfo() {
        return "Magician";
    }
}

interface QuidditchPlayer {
    default String getInfo() {
        return "QuidditchPlayer";
    }
}

static class HarryPotter implements Magician, QuidditchPlayer {
    @Override
    public String getInfo() {
        return Magician.super.getInfo() + ", " + QuidditchPlayer.super.getInfo();
    }
}

public static void main(String[] args) {
    HarryPotter harryPotter = new HarryPotter();
    System.out.println(harryPotter.getInfo());
    // Magician, QuidditchPlayer
}

Поскольку Java позволяет классам реализовывать несколько интерфейсов, важно знать, что происходит, когда класс реализует несколько интерфейсов, определяющих одни и те же методы по умолчанию.

В этом случае код просто не скомпилируется, так как возникает конфликт, вызванный множественным наследованием интерфейсов. Класс унаследует оба набора методов по умолчанию. Так какой же вызовется?

Чтобы решить эту двусмысленность, мы должны явно предоставить реализацию методов. Мы также можем заставить наш класс использовать методы по умолчанию одного из интерфейсов или всех сразу.