首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用Java编写泛型迭代器

用Java编写泛型迭代器
EN

Stack Overflow用户
提问于 2018-04-08 07:39:51
回答 1查看 1.8K关注 0票数 1

当我在内存中存储我的类AbstractState的集合时,我遇到了内存异常,所以我正在尝试编写一个迭代器。我有一点C#知识,但几乎没有Java经验。在C#中,我会编写一个返回IEnumerable<AbstractState>的方法,但在这里似乎不是那么简单。

AbstractState存储一对坐标,但根据实现的不同,对它们的操作会有所不同。(它还扩展了一个通用的MyPair<Coordinate>。)

AbstractState中,我定义了一个构造函数AbstractState(Coordinate A, Coordinate B){super(A,B);}。我在一些但不是所有的子类中覆盖了它。Coordinate是具体的。下面是我的迭代器:

代码语言:javascript
复制
import java.util.Iterator;

public class StateSpace<T extends AbstractState> implements Iterable<T> {
    @Override
    public Iterator<T> iterator() {
        return new StateIterator();
    }
}

和我的迭代器:

代码语言:javascript
复制
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;
    }
}

(这里的GRIDCoordinate的静态范围。)

如何正确实现next()方法?(或者,我的代码有什么更好的设计来解决这个问题?)

实例化T不起作用,我也不能实例化抽象类。我想我试着接近了

代码语言:javascript
复制
getDeclaredConstructor(Coordinate.class, Coordinate.class).newInstance(iX.next(), iY.next());

但是我得到了一个编译器警告,因为没有这样的方法。

当我强制转换为T时,我有未检查的强制转换,所以我怀疑这是一个坏主意。有很多迭代器/迭代器是没有吸引力的,因为我会检查(通过if语句或switch)我需要哪个迭代器,这会破坏我的OO代码设计。

感谢您的任何建议

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-08 07:57:44

this传递给迭代器构造函数。StateSpace可以访问实例化的T类型,因此它可以实现确定如何getNext()hasNext()的方法。目前还不清楚iXiY是关于什么。

代码语言:javascript
复制
import java.util.Iterator;

public class StateSpace<T extends AbstractState> implements Iterable<T> {
    List<T> types;
    int pos;

    public StateSpace() {
        types = new ArrayList<>();
    }
    public void add(T type) {
        types.add(type);
    }
    T getNext() {
        return types.get(pos++);
    }
    boolean hasNext() {
         return pos < types.size()-1;
    }
    @Override
    public Iterator<T> iterator() {
        return new StateIterator(this);
    }
}

代码语言:javascript
复制
public class StateIterator<T extends AbstractState> implements Iterator<T> {
    private Iterator<Coordinate> iX, iY;
    private StateSpace<T> stateSpace;

    StateIterator(StateSpace<T> stateSpace){
        this.stateSpace = stateSpace;
        iX = Main.GRID.iterator();
        iY = Main.GRID.iterator();
    }

    @Override
    public boolean hasNext() {
        return iX.hasNext() || iY.hasNext();
    }

    @Override
    public T next() {
        return stateSpace.getNext(); // or whatever.
    }
}

也许会有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49713031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档