我在查看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中,一切都完美无瑕。
非常感谢任何帮助!
答案 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中。