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
虽然这是不寻常的一个类实现既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
}
}
Run Code Online (Sandbox Code Playgroud)
在另一方面,如果你已经有了一个现成的类,同时实现List
和Set
,然后你的问题最简单的办法也许是显式调用的超级一个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)
这是导致多重继承的钻石问题。
“钻石问题”(有时称为“致命的死亡钻石”)是当两个类B和C从A继承而类D从B和C继承时产生的歧义。 B和C已被覆盖,而D没有覆盖它,那么D继承哪个方法版本:B还是C?
在Java中,编译错误可避免此问题。为了解决这个问题,您应该实施自己的