首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类从类型java.util.Set和java.util.List继承与spliterator()无关的默认值。

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

Stack Overflow用户
提问于 2014-03-30 17:02:51
回答 3查看 4.6K关注 0票数 17

我有实现Set和List的类。程序在Java6和Java7中工作得很好

代码语言:javascript
复制
public class SetList<V> implements Set<V>, List<V>
{
  ....
}

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

trials.SetList :类java.util.Set和java.util.List继承了剪接器()的不相关默认值

java/util/Set.java:394

代码语言:javascript
复制
 ...
@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, Spliterator.DISTINCT);
}

java/util/List.java

代码语言:javascript
复制
...
@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, Spliterator.ORDERED);
}

这是否意味着我不能拥有在Java 8中实现Set和List的类?(看来是时候偿还我们的技术债务了。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-31 13:17:21

虽然类同时实现ListSet是不寻常的,但在某些情况下,Set也可以支持某种程度上有限的List

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

代码语言:javascript
复制
public class SetList<V> implements Set<V> {
    public List<V> asList(){
        // return a list representation of this Set
    }
}

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

代码语言:javascript
复制
public class SetList<V> implements Set<V>, List<V> {
    @Override
    public Spliterator<V> spliterator() {
        return List.super.spliterator();
    }
}
票数 12
EN

Stack Overflow用户

发布于 2016-09-17 07:20:01

我是多重继承中的钻石问题

“钻石问题”(有时被称为“致命的死亡钻石”)是两个类别B和C从A继承,类D继承自B和C,如果A中有一个方法被B和C覆盖,而D没有覆盖它,那么D继承的是哪个版本的方法:B继承,还是C继承?

在Java中,编译错误防止了这个问题。为了解决这个问题,你应该实现你的一个。

票数 10
EN

Stack Overflow用户

发布于 2021-05-12 16:36:40

在我的例子中,我在ListSet类中使用多个基础列表和集合。

由于我碰巧已经实现了size()iterator()方法(使用番石榴Iterators.concat),最简单的解决方案是使用Spliterators.spliterator()重载,接受Iterator和size。

代码语言:javascript
复制
/**
 * 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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22746948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档