1

如何访问扩展数组列表中使用的其他类的类之外的变量?我收到一条错误消息,指出扩展类中不存在该变量。看一下,我想访问变量成员而不必在我的 Object 类中声明它:

public abstract class Object {
    public int x, y;
}

public class House extends Object {
    public int members = 10;
}

// Somewhere else
ArrayList<Object> list = new ArrayList<Object>();
list.add( new House() );
for (Object o : list ) {
    o.members;
}

问题是在我正在编写的 RTS 中,我的 Object 类有超过 40 个变量,只是因为仅在子类中声明它们并从外部访问它们是行不通的。希望你能理解。我怎样才能做到这一点?

4

5 回答 5

8

您可以使用instanceof和演员:

for (Object o : list ) {
    if (o instanceof House) {
        h = (House) o;
        h.members;
    }
}

However, this is often considered bad design; you should consider defining an appropriate method in Object (which should really have another name, as others have pointed out) and override it in House. Then, you may call that method on an Object without knowing what kind of object it refers to, and if it is a House, the correct method will be called. (Learning how to do this properly, and when to do it, takes a bit of practice - google polymorphy and overriding.)

于 2013-05-16T14:11:04.943 回答
3

首先不要命名你的班级Object(见评论)。您无法在代码中访问memberan Object,因为 Object 没有 field memberHouse有。但 anObject不一定是 a House,因此不能保证它有member

如果您确定在这种情况下 youreObject始终a House,请将其转换:

    ((House) anObject).member;

通过这种方式,编译器假定您比他对 Object 的实际类了解更多,并像处理它一样处理它House。您可以使用instanceof来检查演员表是否有效。

于 2013-05-16T14:12:40.213 回答
0

希望您了解您使用类的名称作为“对象”,它是 Java 中所有类的父类。现在在您的环境中将有两个 Object 类,一个是 java 从 java.lang.Object 提供的,另一个是您创建的。因此,当您尝试访问您的类对象并尝试获取其属性时,它实际上不是您的类对象,而是 java.lang.Object 的一个实例,因此您遇到了问题。

于 2013-05-16T14:10:26.363 回答
0

You have to cast o to a House. E.g. ((House) o).members

于 2013-05-16T14:11:38.270 回答
0

just cast the member of arraylist like this

((House)o).members;
于 2013-05-16T14:12:11.507 回答