我使用索引扩展了TreeSet,因此需要重写所有添加/删除操作,以使索引保持最新状态(为简洁起见,下面的代码省略了此操作)。默认的迭代器允许删除元素,但是这避免了这种情况,因此需要设为只读。但是,当我在集合上创建不可修改的视图时,它将调用迭代器,从而导致无限循环。我尝试使用强制类型转换和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();}

}

最佳答案

正如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或更早版本,则也必须重写该方法。)

关于java - Java类中的只读迭代器,用于扩展Collection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26034276/

10-13 04:17
查看更多