【发布时间】:2018-09-17 16:14:26
【问题描述】:
当我将我的类 AbstractState 的集合存储在内存中时,我遇到了内存不足异常,因此我正在尝试编写一个可迭代/迭代器。我有一点 C# 知识,但很少有 Java 经验。在 C# 中,我会编写一个返回 IEnumerable<AbstractState> 的方法,但在这里似乎并不容易。
AbstractState 存储一对坐标,尽管根据实现的不同,对它们的操作会有所不同。 (它还扩展了一个通用的MyPair<Coordinate>。)
在AbstractState 中,我定义了一个构造函数AbstractState(Coordinate A, Coordinate B){super(A,B);}。我在一些但不是所有子类中覆盖了它。 Coordinate 是具体的。这是我的可迭代对象:
import java.util.Iterator;
public class StateSpace<T extends AbstractState> implements Iterable<T> {
@Override
public Iterator<T> iterator() {
return new StateIterator();
}
}
和我的迭代器:
public class StateIterator<T extends AbstractState> implements Iterator<T> {
private Iterator<Coordinate> iX, iY;
StateIterator(){
iX = Main.GRID.iterator();
iY = Main.GRID.iterator();
}
@Override
public boolean hasNext() {
return iX.hasNext() || iY.hasNext();
}
@Override
public T next() {
return null;
}
}
(GRID这里是Coordinates的静态范围。)
如何正确实现next() 方法? (或者,我的代码有什么更好的设计来解决这个问题?)
实例化 T 不起作用,我无法实例化抽象类。我想我已经很接近了
getDeclaredConstructor(Coordinate.class, Coordinate.class).newInstance(iX.next(), iY.next());
但我收到了编译器警告,提示没有这种方法。
当我投射到 T 时,我有未经检查的投射,所以怀疑这是一个坏主意。拥有许多迭代器/可迭代对象并不吸引人,因为我会检查(通过if 语句或switch)我需要哪个迭代器,这会破坏我的OO 代码设计。
任何建议,感谢,谢谢
【问题讨论】:
-
“当我在内存中存储我的类 AbstractState 的集合时”是什么意思?请澄清:您是否已经在内存中有一个 AbstractState 集合,并且在添加时出现内存异常?在这种情况下,迭代它不会帮助你。
-
@inor 抱歉 - 刚刚看到这个。以前我创建了 AbstractState 的集合以供以后使用(在 for 循环中)。我什至无法创建它,因为它太大了。所以我想遍历一个可迭代对象,这样就不需要将每个 AbstractState 存储在内存中
标签: java generics iterator abstract-class ienumerable