2014-09-19 31 views
0

第一次我玩弄類繼承等,但我有點困惑與我如何檢索我設置的信息。 我有一個名爲ClientInfo的類,在那個類中只有名字和年齡。 我有一個擴展名爲ClientAdditionalInfo的類,它只包含一個名爲'additionalinfo'的字符串。類繼承和檢索

當我將擴展的附加信息添加到鏈接列表中時,我無法檢索出來,但我仍然可以獲得年齡和名稱。請看下圖:

List<ClientInfo> list = new LinkedList<>();  

    ClientAdditionalInfo additionalinfo = new ClientAdditionalInfo(); 
    additionalinfo.additionalinfo = "hi"; 
    additionalinfo.age = 4; 
    additionalinfo.name = "name"; 

    list.add(additionalinfo); 

    System.out.println(list.get(0).age); 
    System.out.println(list.get(0).name); 
    //System.out.println(list.get(0).additionalinfo); how do i do this? 

現在,我意識到,我可以改變該列表保存到「ClientAdditionalInfo」類,但隨後會只給到的,如果我想在這個列表中使用更多的類什麼的另一個問題像ClientLocation(我知道我可以把這些變量放在ClientInfo中),但我只是想傳達一個觀點,因爲我可以看到在一個列表中可能需要多個類的擴展的情況。

對不起,這是一個非常糟糕的例子,我意識到我可以用動物或其他東西來做到這一點,使它更清晰,但我希望你能看到我的問題。

感謝您的幫助。 本

回答

5

您將需要轉換的list.get(0)結果 - 編譯器是抱怨,因爲List<ClientInfo>.get(...)肯定會返回一個對ClientInfo兼容對象(或null)的引用,但它可能不是ClientAdditionalInfo

ClientAdditionalInfo fetched = (ClientAdditionalInfo) list.get(0); 
System.out.println(fetched.age); 
System.out.println(fetched.name); 
System.out.println(fetched.additionalinfo); 

注意,你會得到一個ClassCastException如果第一個元素不是一個ClientAdditionalInfo。您可以檢查:

ClientInfo info = list.get(0); 
if (info instanceof ClientAdditionalInfo) 
{ 
    ClientAdditionalInfo fetched = (ClientAdditionalInfo) info; 
    ... 
} 

這種事情是通常設計的氣味 - 通常,如果你需要知道,一個集合的元素是一個特定的子類(而不是僅僅讓子類覆蓋從方法超類,如果他們需要自定義行爲),那麼集合類型應該與該子類一起指定。情況並非總是如此,但至少應該考慮這是否應該是List<ClientAdditionalInfo>

+0

非常感謝您的幫助 – Ben 2014-09-19 10:18:44

2

既然你有你的列表中指定的泛型類型爲ClientInfo,當你得到一個實例淘汰之列,您將收到一個ClientInfo實例,但不是ClientAdditionalInfo實例。它不包含additionalInfo變量。

首先,你必須投的實例ClientAdditionalInfo,然後你可以訪問

可以

ClientAdditionalInfo data = (ClientAdditionalInfo)list.get(0); 
System.out.println(data.additionalinfo); 
+0

非常感謝您的幫助 – Ben 2014-09-19 10:19:25