哪裏有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
哪裏有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
用於描述這些關鍵字的廣泛使用的縮寫是:佩奇:生產者延伸 - 消費者超級。
所以,如果您使用「擴展」您的集合產生給定類型的元素。所以你不能加入它,你只能從中獲益。
一個例子用法是提供您的API的客戶端列表:
public List<? extends CharSequence> getFoo() {
List<String> list = new ArrayList<String>();
list.add("foo");
return list;
}
相關:Java generics: Collections.max() signature and Comparator
我們試圖擺脫它的好處是什麼?我不明白,因爲這個方法的調用者也應該定義一個類型爲List <?的變量。擴展CharSequence>甚至沒有名單
你是正確的,你的ArrayList
不能用它派生的方式:有沒有什麼是你可以投入的。
你想要存儲什麼My_Class
及其子類只是ArrayList<My_Class>
;它將正確地採取My_Class
及其所有DerivedClass
的對象。
嗯......是毫無意義的一個會宣佈ArrayList的這個樣子,而你的意圖將被寫入
的ArrayList <超類型> OBJ =新的ArrayList <超型>()fullfilled;根據我的epxerience,我已經在方法參數中看到了這個概念,您希望調用者提供特定Supertype的子類型的集合(或者像上面有人所說的那樣從方法返回)。像如下
public getAnimals(List< ? extends Animal> obj){
obj.add(something); //not allowed
}
有公平的機會,你可以添加驢,猴子和鳥類等在某些類型的名單說,(猴子)。並從中獲取classCastException。
這就是爲什麼它不允許在這種情況下。閱讀Josh Bloch的Effective Java。他用生產者消費者類比(PECS)
Ahm ...什麼?是的,這正是我在某些情況下想要的。不要回答 – 2012-07-26 12:34:29
這個問題,假設驢子,猴子和鳥類都來源於'動物',那麼......將它們存儲在一個'ArrayList
我不希望自己變得如此愚蠢。我很抱歉...推出更新的答案 – Ahmad 2012-07-26 12:47:40
很好地解釋了它[可以如何將元素添加到通配符泛型集合?](http://stackoverflow.com/questions/176446/how-can-elements-被添加到通配符泛型集合) – 2012-07-27 02:23:06