哪里有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