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);
}
}