Вот простой класс, который демонстрирует проблему:
package com.mimvista.debug;
public class DefaultCollisionTest {
public static interface Interface1 {
public String getName();
}
public static interface Interface2 {
public default String getName() { return "Mr. 2"; };
}
public static <X extends Interface1&Interface2> String extractName(X target) {
return target.getName();
}
}
Eclipse (Neon 2) с радостью компилирует этот класс, а javac (JDK 1.8.0_121) выплевывает следующую ошибку компиляции:
$ javac src/com/mimvista/debug/DefaultCollisionTest.java
src\com\mimvista\debug\DefaultCollisionTest.java:13: error: class INT#1 inherits abstract and default for getName() from types Interface2 and Interface1
public static <X extends Interface1&Interface2> String extractName(X target) {
^
where INT#1 is an intersection type:
INT#1 extends Object,Interface1,Interface2
1 error
Я считаю, что Eclipse в этом случае прав, но я не совсем уверен. Основываясь на моем понимании ошибки "наследует абстрактную и дефолтную", я думаю, что она должна генерироваться только при компиляции реального объявленного класса, который реализует эти два интерфейса. Кажется, что javac может генерировать промежуточный класс под капотом, чтобы справиться с этой общей подписью и ошибочно подвергать его методу столкновений по умолчанию?