Предположим, что существуют два интерфейса Interface1
и Interface2
, где Interface2
продолжается Interface1
.
interface Interface1 {
default void method() {
System.out.println("1");
}
// Other methods
}
interface Interface2 extends Interface1 {
@Override
default void method() {
System.out.println("2");
}
// Other methods
}
Предположим, что я хочу создать класс, который реализует Interface2
, но я хочу, чтобы method()
была версией в Interface1
. Если я напишу
class MyClass implements Interface1, Interface2 {
public void method() {
Interface1.super.method();
}
}
Я получаю ошибку компиляции:
неудачный тип квалификатора при супервызове по умолчанию: избыточный интерфейс Интерфейс1 расширяется интерфейсом2
Это можно обойти, создав третий интерфейс:
interface Interface3 extends Interface1 {
default void method() {
Interface1.super.method();
}
}
Тогда:
class MyClass implements Interface1, Interface2, Interface3 {
public void method() {
Interface3.super.method();
}
}
Это компилируется отлично, и если я создаю новый MyClass
и вызываю method()
, вывод будет 1
, как ожидалось.
Итак, мой вопрос заключается в том, что так легко обойти ограничение, которое вы можете написать только InterfaceName.super.method()
для наиболее конкретного интерфейса в цепочке, в чем причина ограничения? Какие проблемы можно предотвратить, запретив вам сначала писать Interface1.super.method()
?