Интерфейсы. Java 8. Default-методы с одинаковыми именами

Интерфейсы. Java 8. Default-методы с одинаковыми именами

Если класс реализует несколько интерфейсов, которые содержат дефолтные методы с одинаковыми именами и сигнатурой, то класс обязан переопределить их дефолтную реализацию. Иначе код не скомпилируется.


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 */
}
Интерфейсы и Абстрактные классы