
Если класс реализует несколько интерфейсов, которые содержат дефолтные методы с одинаковыми именами и сигнатурой, то класс обязан переопределить их дефолтную реализацию. Иначе код не скомпилируется.
interface I {
default void doSome() {
System.out.println("I does some");
}
}
interface L {
default void doSome() {
System.out.println("L does some");
}
}
class ImplClass implements I, L {} // ошибка компиляции
class ImplClass implements I, L {
@Override
public void doSome() {
System.out.println("ImplClass does some");
}
}
То же самое касается и интерфейсов:
interface ExtInterface extends I, L {} // ошибка компиляции
interface ExtInterface extends I, L {
@Override
default void doSome() {
System.out.println("ExtInterface does some");
}
}
Если класс наследует несколько интерфейсов, имеющих дефолтные методы с одинаковыми именами, но разными сигнатурами, то такой класс не скомпилируется никаким образом.
interface M {
default int returnSome() {
return 10;
}
}
interface N {
default String returnSome() {
return "Hello";
}
}
class ImplMyClass implements M, N { // ошибка компиляции, интерфейсы M и N несовместимы
/* some code */
}