Отказ от ответственности: это не об этом случае (в то время как ошибка звучит так же): класс наследует несвязанные значения по умолчанию для spliterator ( ) из типов java.util.Set и java.util.List
и вот почему:
рассмотрим два интерфейса (в пакете "a
" )
interface I1 {
default void x() {}
}
interface I2 {
default void x() {}
}
Мне определенно ясно, почему мы не можем объявить такой класс, как:
abstract class Bad12 implements I1, I2 {
}
(!) Но я не могу понять это ограничение со ссылкой на переменные типа :
class A<T extends I1&I2> {
List<T> makeList() {
return new ArrayList<>();
}
}
с ошибкой: class java.lang.Object&a.I1&a.I2 inherits unrelated defaults for x() from types a.I1 and a.I2
.
Почему я не могу определить такую переменную типа? Почему java
заботится о несвязанных значениях по умолчанию в этом случае? Что такое переменная типа может "сломаться"?
ОБНОВЛЕНИЕ: Только для уточнения. Я могу создать несколько классов формы:
class A1 implements I1, I2 {
public void x() { };
}
class A2 implements I1, I2 {
public void x() { };
}
и даже
abstract class A0 implements I1, I2 {
@Override
public abstract void x();
}
и т.д. Почему я не могу объявить специальный тип переменной типа для такой группы классов?
UPD-2: BTW Я не нашел каких-либо особых ограничений для этого случая в JLS. Было бы неплохо подтвердить ваш ответ ссылками на JLS.
UPD-3: Некоторые пользователи сказали, что этот код хорошо компилируется в Eclipse. Я не могу проверить это, но я проверил с помощью javac
и получил эту ошибку:
error: class INT#1 inherits unrelated defaults for x() from types I1 and I2
class A<T extends I1&I2> {
^
where INT#1 is an intersection type:
INT#1 extends Object,I1,I2
1 error