2012-07-26 15 views
5

dónde podemos ArrayList<? extends My_Class> ya que no se permitirá añadir ningún elemento nuevo si se declara que de esta manera:¿Dónde podemos usar ArrayList <? se extiende My_Class>

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

posible duplicado de [¿Cómo se pueden agregar elementos a una colección genérica comodín?] (http://stackoverflow.com/questions/176446/how-can-elements- be-added-to-a-wildcard-generic-collection) –

Respuesta

5

El acrónimo utilizado ampliamente para describir estas palabras clave es: PECS: Productor extiende - consumidor super.

Por lo tanto, si usa "extends" su colección produce elementos del tipo dado. Entonces no puedes agregar nada, solo puedes sacarlo.

Un ejemplo de uso sería proporcionar a un cliente de la API con una lista:

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

relacionadas: Java generics: Collections.max() signature and Comparator

+0

¿Cuál es la ventaja que estamos tratando de obtener de ella? No entiendo porque la persona que llama de este método también debe definir una variable de tipo List ni siquiera List y luego tampoco puede modificar la variable recibida por eso no entiendo por qué lo necesitamos – user1554627

2

Tiene usted razón, su ArrayList no se puede utilizar la forma en que se deriva: no no es nada que puedas poner en ello.

Lo que quiere para almacenar My_Class y sus subclases es simplemente ArrayList<My_Class>; tomará objetos de My_Class y todos sus DerivedClass correctamente.

0

Bueno ... no hay punto uno declarará ArrayList como éste, en lugar de sus intenciones serán fullfilled escribiendo

ArrayList < Supertype> obj = new ArrayList < Supertype>();

Según mi experiencia, he visto esta noción en los argumentos del método, donde espera que su interlocutor proporcione una colección de subtipos de Supertipo particular (o regrese de un método del mismo modo que alguien dijo anteriormente). al igual que de la siguiente manera

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

obj.add(something); //not allowed 

} 

hay posibilidades razonables que se pueden agregar burros, monos y aves, etc en su Lista de cierto tipo decir (mono). y obtenga classCastException mientras obtiene de ello.

Es por eso que no está permitido en este caso. lea Java efectivo por Josh Bloch. lo ha explicado bien con la analogía del consumidor productor (PECS)

+0

Ahm ... ¿Qué? Sí, eso es exactamente lo que querría en ciertos casos. No atiende la pregunta –

+0

suponiendo que los burros, los monos y las aves derivan todos de 'Animal' entonces ... ¿cuál es el problema de almacenarlos en un' ArrayList '?? y ... ¿dónde está el desastre potencial? –

+0

No espero ser tan tonto. lo siento..refer actualizado respuesta – Ahmad

Cuestiones relacionadas