2011-11-01 89 views
2

我在查看ArrayList中的子類屬性時遇到了問題。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:找不到符號 符號:變量clientID的 位置:Person類

我曾嘗試帶和不帶instanceof Client的for循環。我也嘗試在for循環參數中使用Client而不是Person。

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

在將它們轉換爲子類之前,我把它們放入了它們自己類型的ArrayList中,並且一切都完美無缺。

任何幫助將不勝感激!

+0

您確定您的人員列表只包含客戶端實例嗎?如果沒有,你會得到錯誤。我也沒有看到你的發佈代碼是如何編譯的,除非你在嘗試'x.clientID'之前將'x'強制轉換爲'Client'類似於'((Client)x).clientID == cid' –

回答

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抽象類,並且因爲沒有這樣的變量,你讓編譯器錯誤。

問候!

+0

很抱歉,這些實際上意味着被列爲受保護的,忽略了當我輸入問題時。編輯的OP也是如此。 –

+0

你也不用擔心inst。變量是你班級的一部分。 X.clientID不會工作,因爲Person類沒有cliendID不是它的一部分。 – Mechkov

0

你需要轉換PersonClient

((Client) x).clientId; 
0

的一點是,ClientID屬性沒有按」 t屬於父類Person。使用這種方法實例來降低對象:

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

即使這是可能的,它通常是一個信號,你有一個設計問題。可能需要重構代碼,例如將Person的不同子類存儲到不同的ArrayList中。