我有一个实体的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函数。我现在有点失落。
答案 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
。