2010-12-21 65 views
4

我最近開始在java中使用泛型,並試圖重構我們團隊的現有代碼。關於java中泛型的查詢

誰能告訴我什麼是錯用以下 -

private ArrayList<? extends WorkTabPane> workTabPanes = null; 
protected <T extends WorkTabPane> void addPane(T pane) { 
    workTabPanes.add(pane); 
} 

Eclipse的指示錯誤,在3號線(在加) - 「Add方法(?捕獲#1-延伸WorkTabPane)在該ArrayList類型是不適用的參數(T)」

+0

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf – 2010-12-21 16:47:32

回答

8

我相信你想有隻

private ArrayList<WorkTabPane> workTabPanes = null; 
protected void addPane(WorkTabPane pane) { 
    workTabPanes.add(pane); 
} 

(您仍然可以添加WorkTabPane子類的列表。)

eclipse抱怨的原因如下:通過編寫<? extends WorkTabPane>你說:「這是一些正在擴展WorkTabPane的特定類的列表」。這個變量可以包含對ArrayList<WorkTabPaneSubclass1>的引用。但是,如果是這種情況,則不應允許您將WorkTabPaneSubclass2類型的項目添加到列表中。你看到問題了嗎?

+0

其實,方法簽名方式應該可以`保護無效addPane(WorkTabPane窗格)`。 – ColinD 2010-12-21 17:03:23

2
private ArrayList<? extends WorkTabPane> workTabPanes = null; 

這是說workTabPanes是保證包含的WorkTabPane或它的一個子類的實例,所以讀取的時候,你知道,就是你的列表。但它可能是一個WorkTabPaneSub s的列表,其中您不能使用常規的WorkTabPane s。

您需要:

private ArrayList<WorkTabPane> workTabPanes = null;