【问题标题】:Read-only iterator in Java class extending a Collection扩展集合的 Java 类中的只读迭代器
【发布时间】:2014-09-25 08:50:01
【问题描述】:

我扩展了一个带有索引的 TreeSet,因此所有的添加/删除操作都需要被覆盖,以使索引保持最新(为简洁起见,从下面的代码中省略)。然而,默认迭代器允许删除元素,这绕过了这一点,因此需要设为只读。但是,当我在集合上创建不可修改的视图时,它会调用迭代器导致无限循环。我没有成功地尝试使用 casts 和 super。如何创建没有无限循环的只读迭代器?

import java.util.Collections;
import java.util.Iterator;
import java.util.TreeSet;

public class MySet<T> extends TreeSet<T>
{
    // StackOverflowError
    @Override public Iterator<T> iterator()
    {return Collections.unmodifiableSortedSet(this).iterator();}

    // Compile Error
//  @Override public Iterator<T> iterator()
//  {return Collections.unmodifiableSortedSet(super).iterator();}

    public static void main(String[] args)
    {new MySet().iterator();}

}

【问题讨论】:

  • 使用组合而不是继承可能更简单。

标签: java collections iterator


【解决方案1】:

正如 assylias 指出的那样,在这种情况下,您可能需要go for composition instead of inheritance

如果你真的想坚持继承,这可能就足够了:

@Override
public Iterator<T> iterator() {
    Iterator<T> delegate = super.iterator();
    return new Iterator<T>() {
        @Override
        public boolean hasNext() {
            return delegate.hasNext();
        }

        @Override
        public T next() {
            return delegate.next();
        }

    };
}

(注意,这是 Java 8,它具有 remove 的默认实现。如果您使用的是 Java 7 或更早版本,则还必须覆盖该方法。)

【讨论】:

  • 这解决了问题,非常感谢(尽管必须将delegate 设为final)!我同意组合会更容易实现,但我已经完成了所有工作,在下一个类似的情况下我肯定会使用组合。
  • 响铃。 “有效最终”是 Java 8 的另一个特性 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 2017-03-10
  • 2011-04-25
  • 2012-03-08
相关资源
最近更新 更多