我使用索引扩展了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/