gpt4 book ai didi

java - Java 类中扩展集合的只读迭代器

转载 作者:行者123 更新时间:2023-12-01 12:29:41 24 4
gpt4 key购买 nike

我用索引扩展了 TreeSet,以便需要重写所有添加/删除操作以保持索引最新(为了简洁起见,在下面的代码中省略了)。然而,默认迭代器允许删除元素,这规避了这一点,因此需要将其设置为只读。但是,当我在集合上创建不可修改的 View 时,它会调用迭代器,从而导致无限循环。我尝试使用强制转换和 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 类中扩展集合的只读迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26034276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com