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

Класс наследует несвязанные значения по умолчанию для 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? (Похоже, пришло время оплатить наши технические долги.)

4b9b3361

Ответ 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 ошибка компиляции предотвращает эту проблему. Для этого вы должны реализовать свой