Назад к вопросам
СБЕР
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();
}
}