2012-07-26 76 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

相关问题