class从类型java.util.Set和java.util.List继承spliterator()的无关默认值

Jay*_*yan 14 java technical-debt java-8

我有实现Set和List的类.程序在Java6和Java7中运行良好

public class SetList<V> implements Set<V>, List<V>
{
  ....
}
Run Code Online (Sandbox Code Playgroud)

使用Java 8,这不会编译.错误是

java:class trials.SetList从类型java.util.Set和java.util.List继承spliterator()的无关默认值

爪哇/ UTIL/Set.java:394

 ...
@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
Run Code Online (Sandbox Code Playgroud)

的java/UTIL/List.java

...
@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, Spliterator.ORDERED);
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着我不能拥有在Java 8中同时实现Set和List的类?(现在看来已经到了支付技术债务的时候了.)

Bal*_*der 11

虽然这是不寻常的一个类实现既ListSet,也有一些情况,其中Set还可以支持是一个比较有限List.

就个人而言,我更喜欢的声明asList()在这些情况下,而不是执行两种方法,ListSet在同一时间.像这样的东西:

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

在另一方面,如果你已经有了一个现成的类,同时实现ListSet,然后你的问题最简单的办法也许是显式调用的超级一个spliterator()方法:

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


Moh*_*shi 5

这是导致多重继承的钻石问题

“钻石问题”(有时称为“致命的死亡钻石”)是当两个类B和C从A继承而类D从B和C继承时产生的歧义。 B和C已被覆盖,而D没有覆盖它,那么D继承哪个方法版本:B还是C?

在Java中,编译错误可避免此问题。为了解决这个问题,您应该实施自己的