2012-07-26 95 views
5

哪裏有ArrayList<? extends My_Class>,因爲它不會讓你添加任何新的內容,如果你申報的這種方式:我們在哪裏可以使用ArrayList <?擴展My_Class>

ArrayList<? extends My_Class> obj=new ArrayList<? extends My_Class>(); 
list.add(new Derived_My_Class()); //this is compilation error 
+0

很好地解釋了它[可以如何將元素添加到通配符泛型集合?](http://stackoverflow.com/questions/176446/how-can-elements-被添加到通配符泛型集合) – 2012-07-27 02:23:06

回答

5

用於描述這些關鍵字的廣泛使用的縮寫是:佩奇:生產者延伸 - 消費者超級。

所以,如果您使用「擴展」您的集合產生給定類型的元素。所以你不能加入它,你只能從中獲益。

一個例子用法是提供您的API的客戶端列表:

public List<? extends CharSequence> getFoo() { 
    List<String> list = new ArrayList<String>(); 
    list.add("foo"); 
    return list; 
} 

相關:Java generics: Collections.max() signature and Comparator

+0

我們試圖擺脫它的好處是什麼?我不明白,因爲這個方法的調用者也應該定義一個類型爲List <?的變量。擴展CharSequence>甚至沒有名單和以後也不能修改收到的變量,這就是爲什麼我不明白爲什麼我們需要它 – user1554627 2012-07-26 13:22:37

2

你是正確的,你的ArrayList不能用它派生的方式:有沒有什麼是你可以投入的。

你想要存儲什麼My_Class及其子類只是ArrayList<My_Class>;它將正確地採取My_Class及其所有DerivedClass的對象。

0

嗯......是毫無意義的一個會宣佈ArrayList的這個樣子,而你的意圖將被寫入

的ArrayList <超類型> OBJ =新的ArrayList <超型>()fullfilled;根據我的epxerience,我已經在方法參數中看到了這個概念,您希望調用者提供特定Supertype的子類型的集合(或者像上面有人所說的那樣從方法返回)。像如下

public getAnimals(List< ? extends Animal> obj){ 

obj.add(something); //not allowed 

} 

有公平的機會,你可以添加驢,猴子和鳥類等在某些類型的名單說,(猴子)。並從中獲取classCastException。

這就是爲什麼它不允許在這種情況下。閱讀Josh Bloch的Effective Java。他用生產者消費者類比(PECS)

+0

Ahm ...什麼?是的,這正是我在某些情況下想要的。不要回答 – 2012-07-26 12:34:29

+0

這個問題,假設驢子,猴子和鳥類都來源於'動物',那麼......將它們存儲在一個'ArrayList '中有什麼問題?和......潛在的災難在哪裏? – 2012-07-26 12:35:09

+0

我不希望自己變得如此愚蠢。我很抱歉...推出更新的答案 – Ahmad 2012-07-26 12:47:40

相關問題