Подтвердить что ты не робот

Почему порядок реализации интерфейсов (со стандартными методами) имеет значение в Java 8?

Как мы все знаем, на Java можно реализовать несколько interfaces. Имеет ли смысл их реализация? Я имею в виду, что реализация B, C такая же, как C, B в Java 8? Мои тесты показывают, что порядок имеет значение, но может ли кто-нибудь объяснить логику этого?

public interface A {
    public default void display() {
        System.out.println("Display from A");
    }
}

public interface B extends A {
    public default void display() {
        System.out.println("Display from B");
    }
}

public interface C extends A {
    public void display();
}

public interface D extends B, C {

}

Приведенный выше код работает нормально. Если изменить порядок B, C на C, B, это даст ошибку: The default method display() inherited from B conflicts with another method inherited from C.

public interface D extends C, B {

}

Edit

Я использую Eclipse (Mars). JDK jdk1.8.0_51. JRE jre1.8.0_60.

4b9b3361

Ответ 1

В любом случае должно быть сообщение об ошибке. Когда я использую jdk 1.8.0_31, я получаю следующую ошибку независимо от порядка интерфейсов:

Отображение метода по умолчанию(), унаследованное от A.B, конфликтует с другим методом, унаследованным от A.C

Решение состоит в том, чтобы либо переопределить display() в D, чтобы просто сказать компилятору, какую реализацию суперкласса использовать:

public interface D extends B, C {
    default void display(){
        B.super.display();
    }
}

Или римейк display() abstract

interface D extends B, C {
    public void display();
}

Если вы действительно получаете эту ошибку, используя более высокую версию, чем я, возможно, стоит отправить отчет об ошибке?

Ответ 2

результат javac (все версии 1.8.0_x):

error: interface D inherits abstract and default for display() from types B and C

resuls от ecj 4.4:

The default method display() inherited from B conflicts with another method inherited from C

resuls от ecj >= 4.4.1:

NO ERROR

Все еще ecj >= 4.4.1 правильно сообщает об ошибке, если изменяется порядок в выражении D extends.

Я заключаю, что это ошибка в Eclipse, которая появилась в 4.4.1. Я зарегистрировал ошибку 477891 для отслеживания.

Изменить: ошибка 477891 была исправлена ​​в Milestone 3 в направлении Eclipse 4.6 (GA: июнь 2016 г.).