如何限制迭代器只返回子类的实例?

时间:2015-06-27 02:37:50

标签: java iterator

我有一些实现可迭代的基类

public class EntityCollection implements Iterable<Entity> {

    protected List<Entity> entities;

    public EntityCollection() {
        entities = new ArrayList<Entity>();
    }

    public Iterator<Entity> iterator() {
        return entities.iterator();
    }

    ... etc

这是子类。

public class HeroCollection extends EntityCollection {

    public void doSomeThing() { ... }

我想做以下事情:

HeroCollection theParty = new HeroCollection();
theParty.add(heroA);
theParty.add(heroB);
for (Hero hero : theParty){
    hero.heroSpecificMethod();
}

但是这在编译时失败了,因为迭代器是返回实体而不是英雄。我正在寻找一些限制列表的方法,使它只能包含子类的类型,这样我就可以在迭代器的结果上调用特定于子类的方法。我知道它必须以某种方式使用泛型,但我似乎无法弄清楚如何构建它。

1 个答案:

答案 0 :(得分:6)

我建议EntityCollection通用。

public class EntityCollection<T extends Entity> implements Iterable<T> {

    protected List<T> entities;

    public EntityCollection() {
        entities = new ArrayList<T>();
    }

    public Iterator<T> iterator() {
        return entities.iterator();
    }

    ... etc

public class HeroCollection extends EntityCollection<Hero> {
    ...
}

然后,HeroCollection的迭代器方法将返回Iterator&lt; Hero&gt;

(另请注意:您设计集合的方式(使用针对特定类型集合的单独方法)建议您的代码可能设计不佳。但是,如果是这样,这是一个单独的问题。)