我有实现Set和List的类。程序在Java6和Java7中工作得很好
public class SetList<V> implements Set<V>, List<V>
{
....
}使用Java 8,这不会编译。错误是
trials.SetList :类java.util.Set和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);
}这是否意味着我不能拥有在Java 8中实现Set和List的类?(看来是时候偿还我们的技术债务了。)
发布于 2014-03-31 13:17:21
虽然类同时实现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
}
}另一方面,如果您已经有了一个实现List和Set的现有类,那么解决问题的最简单的解决方案可能是显式调用超级spliterator()方法之一:
public class SetList<V> implements Set<V>, List<V> {
@Override
public Spliterator<V> spliterator() {
return List.super.spliterator();
}
}发布于 2016-09-17 07:20:01
我是多重继承中的钻石问题。
“钻石问题”(有时被称为“致命的死亡钻石”)是两个类别B和C从A继承,类D继承自B和C,如果A中有一个方法被B和C覆盖,而D没有覆盖它,那么D继承的是哪个版本的方法:B继承,还是C继承?
在Java中,编译错误防止了这个问题。为了解决这个问题,你应该实现你的一个。
发布于 2021-05-12 16:36:40
在我的例子中,我在ListSet类中使用多个基础列表和集合。
由于我碰巧已经实现了size()和iterator()方法(使用番石榴Iterators.concat),最简单的解决方案是使用Spliterators.spliterator()重载,接受Iterator和size。
/**
* A custom list container that combines a set of unchangeable items with a list of changeable ones.
* An iterator {@link #iterator()} is available that will iterate first through the unchangeable
* items and then through the changeable ones. {@link #size()} is the total combined size and
* {@link #get(int)} can return either an item from the unchangeable list or the changeable one.
*
* @param <E>
*/
class ListSet<E> implements List<E>, Set<E> {
@NonNull
private final ImmutableList<E> mConstantItemsList;
@NonNull
private final ImmutableSet<E> mConstantItemsSet;
@NonNull
private final List<E> mVariableItems;
ListSet(Set<E> constantItems) {
mConstantItemsSet = ImmutableSet.copyOf(constantItems);
mConstantItemsList = ImmutableList.copyOf(constantItems);
mVariableItems = Lists.newArrayList();
}
@NonNull
@Override
public Iterator<E> iterator() {
return Iterators.concat(mConstantItemsList.iterator(), mVariableItems.iterator());
}
@Override
public int size() {
return mConstantItemsList.size() + mVariableItems.size();
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public Spliterator<E> spliterator() {
return Spliterators.spliterator(iterator(), size(), Spliterator.ORDERED | Spliterator.DISTINCT);
}
}https://stackoverflow.com/questions/22746948
复制相似问题