Ответ
Возникнет конфликт компиляции. Компилятор Java потребует явного разрешения этой неоднозначности в классе-реализации.
Правило: Если класс реализует несколько интерфейсов, и более чем один из них предоставляет default-метод с одинаковой сигнатурой (имя и параметры), класс должен переопределить этот метод.
Способы разрешения конфликта в классе:
- Предоставить собственную реализацию.
- Явно указать, реализацию какого интерфейса использовать, используя синтаксис
InterfaceName.super.methodName().
Пример:
interface PrinterA {
default void print() {
System.out.println("Print from A");
}
}
interface PrinterB {
default void print() {
System.out.println("Print from B");
}
}
// Класс ДОЛЖЕН переопределить `print`
class MultiPrinter implements PrinterA, PrinterB {
// Способ 1: Своя реализация
// @Override
// public void print() {
// System.out.println("Custom print");
// }
// Способ 2: Выбрать реализацию PrinterA
@Override
public void print() {
PrinterA.super.print(); // Явный вызов default-метода из PrinterA
}
}
public class Main {
public static void main(String[] args) {
new MultiPrinter().print(); // Вывод: Print from A
}
}
Важно: Если интерфейсы находятся в иерархии наследования (один наследует от другого), то побеждает метод из более специфичного интерфейса, и конфликта не возникает.