2012-04-03 95 views
0

讓我們假設我有一個可以擴展的類A.在那個A類中,我有一個名單List<A>。因此,這個類將包含一個列表元素A.現在如果我繼承這個類B擴展A,我希望類B有相同的成員List<B>,即相同的列表,但這種類型包含類型的項目。這是可能的使用泛型?我可以看到類似A <T extends A>的東西,同時聲明瞭List<T>,但我不喜歡,因爲關於類類型的信息已經存在。還有更好的解決方案嗎?下面的示例:給列表與包含它的類相同的類型

public class A { 
    List<A> list = new ArrayList<A>(); 
} 

public class B extends A { 
} 

我想列表,以便在B類通用型B的

+2

如果您發佈了A和B的代碼而不是描述它,會更容易理解。 – assylias 2012-04-03 13:01:48

+0

完成 - 在說明中添加示例 – user1032285 2012-04-03 13:09:57

回答

0

您可以在一般的使用extends關鍵字。 例如:

public class A { 

    protected List<? extends A> list; 
    public A() { 
     list = new ArrayList<A>(); 
    } 

    public <T extends A> List<T> getList() { 
     return (List<T>) list; 
    } 
    public void setList(List<A> list) { 
     this.list = list; 
    } 
} 


public class B extends A { 

    public B() { 
     list = new ArrayList<B>(); 
    } 

    public static void main(String[] args) { 
     A a = new A(); 
     a.getList().add(new A()); 

     B b = new B(); 
     b.getList().add(new B()); 
    } 
} 
+0

如何將元素添加到列表中?如果你有'?',你可以只添加null。 – 2012-04-03 13:16:43

+0

我認爲ajozwik是正確的 - 你不能添加元素到列表 – user1032285 2012-04-03 13:35:39

+0

@ user1032285,我更新了答案,它與ajozwik的答案相同。 – 2012-04-03 13:59:48

2

如果你想放的行爲在超類,那麼你將不得不告訴父類的子類是什麼類型的類。這可以通過向super添加一個通用類型來完成。

public class A<E> { 

    protected List<E> items; 

    public A() { 
    this.items = new ArrayList<E>(); 
    } 
} 

public class B extends A<B> { 

    public static void main(String[] args) { 
    B b = new B(); 

    b.items.add(b); 
    } 
} 
+0

這就是我現在的樣子(用E擴展A來增加額外的安全性) - 我一直在尋找比這個 – user1032285 2012-04-03 13:37:22

相關問題