Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList中的子类<;超类>;方法调用问题_Java - Fatal编程技术网

Java ArrayList中的子类<;超类>;方法调用问题

Java ArrayList中的子类<;超类>;方法调用问题,java,Java,我有一个实体的数组列表。实体类具有 public void update(int delta, Level level, ArrayList<Entity> entities){ //do stuff } 它直接调用实体函数,特定于玩家的东西不会发生,但是如果我这样调用它: for(Entity entity : entities) //contains an object of Player entity.update(delta, leve

我有一个实体的数组列表。实体类具有

public void update(int delta, Level level, ArrayList<Entity> entities){
    //do stuff
}
它直接调用实体函数,特定于玩家的东西不会发生,但是如果我这样调用它:

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();
}
私有静态类Foo{
公开作废印刷品(){
System.out.println(“我是FOO”);
}
}
私有静态类栏扩展了Foo{
公开作废印刷品(){
System.out.println(“我是律师”);
super.print();
}
}
公共静态void main(字符串[]args){
ArrayList foos=新的ArrayList();
添加(新的Foo());
添加(新条());
for(Foo-leFoo:foos)
leFoo.print();
}

当对象是条时,它实际上从条调用print函数。这一点我有点不知所措。

由于您有多个级别的类,您必须确保
Player.update()
方法签名引用了正确的一个(以便成功重写):

公共类播放器{
@凌驾
公共无效更新(int delta、game.level.level、ArrayList实体){…}
}

以下代码对我适用:

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);
    }
}
List-doulist=new-ArrayList();
添加(新实体());
添加(新玩家());
for(实体:傻瓜主义者){
实体更新(1,傻瓜);
}
私有静态类实体{
公共无效更新(整数增量,列出实体){
System.out.println(“实体内”);
}
}
私有静态类播放器扩展实体{
@凌驾
公共无效更新(整数增量,列出实体){
System.out.println(“在播放器中”);
超级更新(三角洲、实体);
}
}
确保在
Player.update(…)
方法上需要一个
@Override
。这可能是因为签名不匹配,所以您实际上没有覆盖您认为是的方法签名

其他几点意见:

  • 通常,在处理列表时,我们传递的是
    List
    ,而不是实现
    ArrayList

  • 如果迭代实体列表并将其传递到方法调用中,则需要确保更新方法没有更改列表,否则将抛出
    ConcurrentModificationException


你怎么知道
Player.update(…)
在调用
update()
的超类版本时没有被调用?它还会更改坐标并向控制台打印“yoo”?你是否意外地使其中一个或多个方法变为静态?另外,将
@Override
注释添加到子类方法中,以确保它覆盖父类中的某些内容。那么这就是问题所在:有两个
Level
类,
Entity
使用一个,
Player
使用另一个,使得方法签名不同。添加了显示如何修复的答案。这就是为什么
@Override
是您的朋友
public class Player {

  @Override
  public void update(int delta, game.level.Level level, ArrayList<Entity> entities) { ... }
}
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);
    }
}