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

```java // 2 public class Interfaces { public static void main(String[] args) { A a = new A() {}; B b = new B() {}; AB ab = new AB(); a.print(); b.print(); ab.print(); } public interface A { default void print() { System.out.println("interface A"); } } public interface B extends A { default void print() { System.out.println("interface B"); } } public static class AB implements A, B { } } ```

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

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

sobes.tech AI

В данном коде есть интерфейсы A и B, где B наследует A и переопределяет метод print(). Класс AB реализует оба интерфейса A и B, но не переопределяет метод print().

При вызове методов:

  • A a = new A() {}; — анонимная реализация интерфейса A, вызов a.print() выведет "interface A".
  • B b = new B() {}; — анонимная реализация интерфейса B, вызов b.print() выведет "interface B".
  • AB ab = new AB(); — класс AB реализует оба интерфейса, но не переопределяет print(). В случае конфликтов default методов при множественном наследовании интерфейсов в Java, класс обязан явно переопределить метод, чтобы разрешить конфликт. Поскольку этого нет, код не скомпилируется.

Если добавить в класс AB явное переопределение метода print(), например:

@Override
public void print() {
    B.super.print(); // или A.super.print();
}

тогда вызов ab.print() выведет "interface B" (если выбрано B.super.print()).

Итого:

  • Код не скомпилируется из-за конфликта default методов в AB.
  • Нужно явно переопределить print() в AB, чтобы разрешить конфликт.

Пример исправления:

public static class AB implements A, B {
    @Override
    public void print() {
        B.super.print();
    }
}