Странное поведение при множественном наследовании - Java 8 - PullRequest
0 голосов
/ 21 июня 2020

В следующем коде, если я раскомментирую I3 и реализую I2 и I3, то произойдет сбой compilation со следующей ошибкой:

несвязанные значения по умолчанию для m2 () из I3 и I2

Это такое же прекрасное и ожидаемое поведение.

Однако, когда я заменяю I3 на I, он успешно компилируется, и я получаю I2 в качестве вывода.

public class DefaultMethodTest implements I, I2 {
    public static void main(String[] args) {
        DefaultMethodTest obj = new DefaultMethodTest();
        obj.m2();
     }
}
    
interface I {
        default void m2() {
        System.out.println("I1");
    }
}

interface I2 extends I {
        default void m2() {
        System.out.println("I2");
    }
}

//interface I3 extends I {
//
//    default void m2() {
//        System.out.println("I3");
//    }
//}

Теперь у меня есть пара вопросов:

  • Почему во втором случае нет сбоя compilation, хотя оба интерфейса имеют одинаковый метод по умолчанию m2?

  • Почему I2 имеет приоритет над I?.

Примечание: этот вопрос не относится к java -8-наследование-метода-по умолчанию

1 Ответ

2 голосов
/ 21 июня 2020

В соответствии с правилами разрешения метода по умолчанию, будет выбран метод по умолчанию в наиболее специфичном c интерфейсе предоставления по умолчанию . В вашем случае и I, и I2 имеют метод по умолчанию (каждый) с одинаковой подписью. Следовательно, он выберет I2, который является вашим наиболее специфичным c предоставляющим интерфейсом по умолчанию .

С другой стороны, если вы implement I2, I3, возникнет конфликт, который вам необходимо разрешить. (путем реализации m2 в вашем классе).

Ссылки:

http://www.lambdafaq.org/how-are-conflicting-method-declarations-resolved/ https://javadevcentral.com/default-method-resolution-rules

...