Класс наследует несвязанные значения по умолчанию для spliterator() из типов java.util.Set и java.util.List
У меня есть класс, который реализует Set и List. Программы отлично работают в Java6 и Java7
public class SetList<V> implements Set<V>, List<V>
{
....
}
С Java 8 это не компилируется. Ошибка
java: класс trials.SetList наследует несвязанные значения по умолчанию для spliterator() из типов java.util.Set и java.util.List
Java/Util/Set.java: 394
...
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
Java/Util/List.java
...
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.ORDERED);
}
Означает ли это, что у меня не может быть класса, который реализует как Set, так и List в Java 8? (Похоже, пришло время оплатить наши технические долги.)
Ответы
Ответ 1
В то время как необычно, что класс реализует как List
, так и Set
, есть некоторые ситуации, где Set
также может поддерживать несколько ограниченный List
.
Лично я предпочитаю объявлять метод asList()
в этих случаях вместо одновременного использования как List
, так и Set
. Что-то вроде этого:
public class SetList<V> implements Set<V> {
public List<V> asList(){
// return a list representation of this Set
}
}
С другой стороны, если у вас уже есть существующий класс, который реализует как List
, так и Set
, то самым простым решением для вашей проблемы является, возможно, явно вызов одного из методов super spliterator()
:
public class SetList<V> implements Set<V>, List<V> {
@Override
public Spliterator<V> spliterator() {
return List.super.spliterator();
}
}
Ответ 2
Это Проблема с алмазом, которая вызывает множественное наследование.
"Проблема с алмазами" (иногда называемая "смертельным алмазом" смерть ") является двусмысленностью, которая возникает, когда два класса B и C наследовать от A, а класс D наследуется как от B, так и от C. Если есть метод в A, который B и C переопределены, и D не переопределяет его, то какая версия метода наследует D: из B или из С?
В Java ошибка компиляции предотвращает эту проблему. Для этого вы должны реализовать свой