Sobes.tech
Назад к вопросам
Senior
4

Что произойдёт если B не extends A, а оба интерфейса независимы с одинаковым default методом?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

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

Чтобы исправить ситуацию, нужно в классе реализовать этот метод и явно указать, какой из интерфейсных методов использовать, например, через синтаксис InterfaceName.super.methodName():

interface A {
    default void foo() {
        System.out.println("A's foo");
    }
}

interface B {
    default void foo() {
        System.out.println("B's foo");
    }
}

class C implements A, B {
    @Override
    public void foo() {
        // Явно выбираем реализацию из интерфейса A
        A.super.foo();
    }
}

Без такого переопределения компиляция не пройдет.