ArrayList <superclass>方法中的子类调用问题</superclass>

时间:2012-09-26 18:27:24

标签: java

我有一个实体的arraylist。实体类有

public void update(int delta, Level level, ArrayList<Entity> entities){
    //do stuff
}

实体的子类,Player,有一个覆盖它的函数

public void update(int delta, Level level, ArrayList<Entity> entities){
    //do player specific stuff
    super.update(delta, level, entities);
}

当我从实体的arraylist调用播放器对象更新功能时,如下所示:

for(Entity entity : entities)            //contains an object of Player
    entity.update(delta, level, entities);

它直接调用实体函数并且播放器特定的东西不会发生,但是如果我这样称呼它:

((Player)entities.get(0)).update(delta, level, entities);

确实如此。我以为我理解了这个问题,但我尝试了下面的代码

private static class Foo{
    public void print(){
        System.out.println("I AM FOO");
    }
}
private static class Bar extends Foo{
    public void print(){
        System.out.println("i am bar");
        super.print();
    }
}
public static void main(String[] args){
    ArrayList<Foo> foos = new ArrayList<Foo>();
    foos.add(new Foo());
    foos.add(new Bar());
    for(Foo leFoo: foos)
        leFoo.print();
}

当对象是条形时,它实际上从Bar调用print函数。我现在有点失落。

2 个答案:

答案 0 :(得分:1)

由于您有多个Level类,因此必须确保Player.update()方法签名引用正确的类(以便成功覆盖):

public class Player {

  @Override
  public void update(int delta, game.level.Level level, ArrayList<Entity> entities) { ... }
}

答案 1 :(得分:0)

以下代码适用于我:

List<Entity> fooList = new ArrayList<Entity>();
fooList.add(new Entity());
fooList.add(new Player());
for (Entity entity : fooList) {
    entity.update(1, fooList);
}

private static class Entity {
    public void update(int delta, List<Entity> entities) {
        System.out.println("in Entity");
    }
}
private static class Player extends Entity {
    @Override
    public void update(int delta, List<Entity> entities) {
        System.out.println("in Player");
        super.update(delta, entities);
    }
}

确保@Override方法需要Player.update(...)。签名可能不匹配,因此您实际上并没有覆盖您认为自己的方法签名。

其他几条评论:

  • 通常,当我们处理列表时,我们会传递List<?>而不是实施ArrayList<?>

  • 如果您正在遍历实体列表将其传递给方法调用,则需要确保更新方法更改否则你将抛出ConcurrentModificationException