2014-11-16 34 views
0

我之前問過這個問題,但從未得到解決方案。將子類添加到列表中 - 方法add(捕獲#2-of?擴展了TopBean)...不適用於參數(TopBean)

我想添加一個子類型定義如下。這應該是100%合法的,子類型擴展了主類型。

private List<? extends TopBean> beans; 

public List<? extends TopBean> getBeans() { 
     return beans; 
} 

我試圖做到這一點:

this.getBeans().add(new SecondaryBean()); 

SecondaryBean延伸TopBean(不直接,但在一定程度上)。

這是推動我堅果 - 錯誤是

The method add(capture#2-of ? extends TopBean) in the type List<capture#2-of ? extends TopBean> is not applicable for the arguments (SecondaryBean) 

如果我將其轉換爲TopBean,同樣的錯誤,只是diffent措辭

牛逼he method add(capture#2-of ? extends TopBean) in the type List<capture#2-of ? extends TopBean> is not applicable for the arguments (TopBean)

必須添加子SecondaryBean進入通用TopBeans列表。在這裏做什麼?

回答

2

您不能將以這種方式定義的非空值添加到通配符。

若你要定義它

List<? super TopBean> 

然後添加擴展TopBean是可能的,但得到了一個不同的故事什麼 - 只是事情TopBean擴展或實現

我不明白你爲什麼定義您的列表作爲通配符放在第一位,將其定義爲List似乎可以爲您提供所需的一切。方法有時應該用wikdcards定義,但現在數據成員

0

基本上你的聲明是錯誤的。不要在變量聲明或返回類型中使用通配符。僅爲方法參數使用通配符。

private List<TopBean> beans; 

public List<TopBean> getBeans() { 
     return beans; 
} 

可能有很多的原因,並討論爲什麼你沒有在任何地方使用通配符,但方法的參數,但是這是我個人的一般規則。它過於簡單化,但將涵蓋Java中所有真實世界中泛型使用的90%至99%。

現在,我已經給出了上述代碼,您可以將TopBean添加到列表或TopBean的任何子類中。

0

我修復了這個問題。隨着下面的演員,錯誤消失(有一個警告,但我可以忍受這一點)。

((List<SecondaryBean>)this.getBeans()).add(new SecondaryBean()); 

我保證會有一個SecondaryBean列表,所以這是安全的。

相關問題