不同类型的对象数组

时间:2013-08-16 13:10:25

标签: java arrays class object types

我将游戏编程为Java applet,我有两个不同的类,它们具有相似的变量 - PavementWay

我想创建一个包含两个类对象的Array。我必须更改所有这些对象的xy,因此我想创建一个Array。这可能吗?

我已尝试ArrayList<Object> obj = new ArrayList<Object>();,但如果我obj.add(0, theWay);我无法找到读取变量的方法。

我还尝试System.out.print(obj.get(0));并获得了rpg.way@2c61bbb7

3 个答案:

答案 0 :(得分:6)

简而言之,您希望在Way实例或Pavement实例上调用方法(如setX()),而不知道对象是方式还是路面。

这正是多态性解决的问题。定义接口Locatable,并使您的两个类实现此接口。然后创建一个List<Locatable>,您就可以在其中添加Ways和Pavements:

public interface Locatable {
    public void setX(int x);
    public void setY(int y);

    public int getX();
    public int getY();
}

public class Way implements Locatable {
    ...
}

public class Pavement implements Locatable {
    ...
}

List<Locatable> locatables = new ArrayList<Locatable>();
list.add(new Way());
list.add(new Pavement());
for (Locatable locatable: locatables) {
    locatable.setX(22);
    locatable.setY(43);
}

for (Locatable locatable: locatables) {
    System.out.println("the locatable is an instance of " + locatable.getClass());
    System.out.println("its location is " + locatable.getX() + ", " + locatable.getY());

}

答案 1 :(得分:1)

您可以使用ArrayList<Object>检查对象的类型。

例如:

ArrayList<Object> L = new ArrayList<Object>();
//..add objects
for (Object o : L){
    if(o.getClass() == Class1.class){
        Class1 obj1 = (Class1) o;
        //...
    }else if(o.getClass() == Class2.class){
        Class2 obj2 = (Class2) o;
        //...
    }else{
        //...
    }
}

您也可以使用instanceof来检查类型。

答案 2 :(得分:0)

你提到的课程不同但相似吗?如果类足够相似以至于您想尝试在类上调用相同的方法,那么您可能需要考虑使用抽象类来泛化类:这比“实例”和种姓解决方案更好。您也可以使用接口,但是抽象类允许您实际实现changeX()和changeY(),如果它们以相同的方式工作。例如,如果要在任一对象上调用changeX(int x)或changeY(int y),无论它们是Way还是Pavement对象,您可能想要做类似这样的事情:

public abstract class Changeable
{
    public void changeX(int x) {
        this.x = x;
    }
    public void changeY(int y) {
        this.y = y;
    }

    protected int x;
    protected int y;
}

public Class Pavement extends Changeable{ ... }

public Class Way extends Changeable{ ... }

此时您可以创建一个接口数组并在其中插入对象:

List<Changeable> paths = new ArrayList<Changeable>();
paths.add(new Way());
paths.add(new Pavement());
Changeable path = paths.get(0);
path.changeX(5);
path.changeY(7);