2012-09-26 37 views
2

比方說,我有一個名爲MemberNio(含的SocketChannel和其他NIO特定對象)類延伸會員類。Java的面向對象設計:接口和列表

方法getMember(ID)和getMembers返回MemberNio對象。 不需要了解的東西仁王的東西我的應用程序層可能只是調用getMember方法獲取的成員,並使用超會員:

Member member = membersMgr.getMember(id); 

但是當我嘗試出現問題調用getMembers

List<Member> members = membersMgr.getMembers(); // <- error, can't cast List<MemberNio> to List<Member> 

這將迫使我有MemberNio對象,我應該只知道會員對象。

當我使用Lists和Interfaces/suptypes時,這是一個反覆出現的問題。

+1

那麼,爲什麼你不從你的方法返回'成員'的列表? – Tudor

+0

一些類需要MemberNio對象,否則我只會使用Members。 我仍然可以創建方法getMembersNio和另一個方法getMembers,但它對我來說似乎是錯誤的。 – Matthew

回答

6

您可以使用: -

List<? extends Member> members = membersMgr.getMembers(); 
for (Member member: members) { 
    if (member instanceof MemberNio) { 
      MemberNio memNio = (MemberNio)member; 
      /** Do your stuff **/ 
    } 
} 

,以獲取使用membersenhanced-for loop,我們使用的概念: - Super type Reference pointing the Subclass object。所以,無論哪個subclass對象存儲在list,我們總是相應地使用一個super-class參考指向它們..然後TypeCast通過檢查實際instance type ..

而且使getMembers()相同的返回類型。它會工作。

這樣,你可以返回MemberList或任何類extends your Member類..而且你也不需要給這些類明確的名稱..

+0

但是,如果我循環訪問列表的成員對象,如何獲得MemberNio對象? List <? extends Member> members = membersMgr.getMembers(); for(MemberNio member:members)// < - error – Matthew

+0

編輯代碼..你可以看到它.. –

1

泛型在本質上invariant。這意味着List<MemberNio>不是List<Member>的子類型 您可以使用wildcards指定邊界。

List<? extends Member> which means List of Member or any subclass of Member