class inherits unrelated defaults for spliterator() from types java.util.Set and java.util.List

前提是你 提交于 2019-12-06 18:12:26

问题


I have class that implements Set and List. Programs works fine in Java6 and Java7

public class SetList<V> implements Set<V>, List<V>
{
  ....
}

With Java 8 , this does not compile. Error is

java: class trials.SetList inherits unrelated defaults for spliterator() from types java.util.Set and 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);
}

Does it mean I cannot have class that implement both Set and List in Java 8? (It looks like time has come to pay our technical debts.)


回答1:


While it is unusual that a class implements both List and Set, there are some situations, where a Set can also support being a somewhat limited List.

Personally, I prefer to declare an asList() method in these cases, instead of implementing both List and Set at the same time. Something like this:

public class SetList<V> implements Set<V> {
    public List<V> asList(){
        // return a list representation of this Set
    }
}

On the other hand, if you already have an existing class, that implements both List and Set, then the simplest solution for your problem is perhaps to explicitly call one of the super spliterator()methods:

public class SetList<V> implements Set<V>, List<V> {
    @Override
    public Spliterator<V> spliterator() {
        return List.super.spliterator();
    }
}



回答2:


This is Diamond Problem that causes in Multiple inheritance.

The "diamond problem" (sometimes referred to as the "deadly diamond of death") is an ambiguity that arises when two classes B and C inherit from A, and class D inherits from both B and C. If there is a method in A that B and C have overridden, and D does not override it, then which version of the method does D inherit: that of B, or that of C?

In Java , compile error prevents this problem. For resolving this You should implement yours one



来源:https://stackoverflow.com/questions/22746948/class-inherits-unrelated-defaults-for-spliterator-from-types-java-util-set-and

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!