class从类型java.util.Set和java.util.Listinheritancespliterator()的无关默认值

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

public class SetList implements Set, List { .... } 

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

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

爪哇/ UTIL / Set.java:394

  ... @Override default Spliterator spliterator() { return Spliterators.spliterator(this, Spliterator.DISTINCT); } 

的java / UTIL / List.java

 ... @Override default Spliterator spliterator() { return Spliterators.spliterator(this, Spliterator.ORDERED); } 

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

虽然类实现ListSet是不常见的,但在某些情况下, Set也可以支持有限的List

就个人而言,我更喜欢在这些情况下声明一个asList()方法,而不是同时实现ListSet 。 像这样的东西:

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

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

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

这是导致多重inheritance的钻石问题 。

“钻石问题”(有时被称为“死亡的致命钻石”)是一种歧义,当两个B和C类inheritance自A,而D类inheritance自B和C时会出现歧义。如果A中有一个方法B和C已经覆盖了,而D没有覆盖它,那么Dinheritance的方法的哪个版本:B的那个,还是C的那个?

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