ArrayList无法识别子类变量

时间:2011-11-01 20:53:38

标签: java

我在查看ArrayList中的子类属性时遇到问题。

以下是我的代码主要部分的一些片段,这里很重要。

private ArrayList<Person> people = new ArrayList<Person>;

abstract class Person {
String fName;
String lName;
}

public class Employee extends Person {
protected int empID;
}

public class Client extends Person {
protected int clientID;
}

当使用for循环来搜索clientID时,我正在

Enterprise.java:134:找不到符号 symbol:变量clientID location:class Person

我在for循环中尝试使用和不使用instanceof Client。我也尝试在for循环参数中使用Client而不是Person。

for(Person x : people) {
if(x.clientID == cid) {
    System.out.println(x);
}

在将这些变成子类之前,我将它们放在他们自己类型的ArrayList中,一切都完美无瑕。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:4)

你必须将它们放在一个单独的列表中并投射它们:

for (Person person : people) {
  if (person instanceof Client) {
    Client client = (Client) person;
    if (client.clientID == cid) {
      System.out.println("found!");
    }
  }
}

答案 1 :(得分:0)

您正在使用私有实例变量。在他们自己的班级之外的任何地方都看不到。 改为受保护或公共机构。变量并应解决问题。

此代码

x.clientID == cid

正在Person抽象类中查找实例变量,因为没有这样的变量会导致编译错误。

问候!

答案 2 :(得分:0)

您需要将Person转换为Client

((Client) x).clientId;

答案 3 :(得分:0)

重点是clientID属性不属于父类Person。以这种方式使用instanceof来向下转换对象:

for(Person x : people) {
    if (x instanceof Client){
         Client c = (Client) x;
         if(c.clientID == cid) {
             System.out.println(x);
         }
}

即使这是可能的,通常也是一个设计问题的信号。您可能需要重构代码,例如将Person的不同子类存储到不同的ArrayList中。