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

时间:2014-03-30 17:02:51

标签: java java-8 technical-debt

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

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

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

  

java:class trials.SetList继承了不相关的默认值   来自java.util.Set和java.util.List类型的spliterator()

的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);
}

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

3 个答案:

答案 0 :(得分:11)

虽然一个类同时实现ListSet是不寻常的,但在某些情况下,Set也可以支持有限的List。< / p>

就个人而言,我更倾向于在这些情况下声明asList()方法,而不是同时同时实施ListSet。像这样:

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

另一方面,如果您已经有一个现有的类,它实现了ListSet,那么对您的问题最简单的解决方案可能是显式调用其中一个超级{{1 }}方法:

spliterator()

答案 1 :(得分:4)

这是Diamond Problem that causes in Multiple inheritance

  

“钻石问题”(有时被称为“钻石问题”)   死亡“)是两个B和C类时产生的歧义   继承自A,而D类继承自B和C.如果有   A中B和C已覆盖的方法,D不会覆盖它,   然后D继承的方法的哪个版本:B的那个版本,或者   C 1

在Java中,编译错误可以防止出现此问题。要解决这个问题,你应该实现一个

答案 2 :(得分:0)

就我而言,我在 ListSet 类中使用了多个底层列表和集合。

由于我碰巧已经实现了 size()iterator() 方法(使用 Guava Iterators.concat),因此最简单的解决方案是使用接受 {{1} } 和大小。

Spliterators.spliterator()