2012-07-26 12 views
5

dove possiamo ArrayList<? extends My_Class> perché non vi permetterà di aggiungere qualsiasi nuovo elemento se si dichiara che in questo modo:Dove possiamo usare ArrayList <? si estende my_class>

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

possibile duplicato di [Come possono essere aggiunti elementi a una raccolta generica con caratteri jolly?] (http://stackoverflow.com/questions/176446/how-can-elements- be-added-to-a-wildcard-generic-collection) –

risposta

5

L 'acronimo ampiamente utilizzato per descrivere queste parole chiave è: PECS: Produttore estende - il consumatore super.

Quindi, se si utilizza "estende" la propria collezione produce elementi del tipo specificato. Quindi non puoi aggiungerlo, puoi solo prenderlo.

Un esempio d'uso sarebbe quello di fornire un cliente della vostra API con una lista:

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

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

+0

Qual è il vantaggio che stiamo cercando di ottenere da esso non capisco perché il chiamante di questo metodo dovrebbe anche definire una variabile di tipo List nemmeno la lista e successivamente anche tu non puoi modificare la variabile ricevuta ecco perché non capisco perché ne abbiamo bisogno – user1554627

2

Lei ha ragione, il vostro ArrayList non può essere utilizzato il modo in cui è derivato: c'è è nulla che puoi mettere in esso.

Quello che si desidera per la memorizzazione di My_Class e le sue sottoclassi è semplicemente ArrayList<My_Class>; prenderà oggetti di My_Class e tutti i suoi DerivedClass correttamente.

0

Beh ... Non ha senso una dichiarerà ArrayList come questo, piuttosto le vostre intenzioni saranno fullfilled scrivendo

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

Come per la mia epicità, ho visto questa nozione negli argomenti del metodo, dove ci si aspetta che il chiamante fornisca una raccolta di sottotipi di particolare Supertipo (o di ritorno da un metodo come qualcuno ha detto sopra). come nel seguente

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

obj.add(something); //not allowed 

} 

ci sono possibilità di fair che è possibile aggiungere asini, scimmie e uccelli, ecc nella vostra lista di certo tipo dire (scimmia). e ottenere classCastException mentre si ottiene da esso.

Ecco perché non è consentito in questo caso. leggi l'efficace Java di Josh Bloch. lo ha spiegato bene con l'analogia del consumatore produttore (PECS)

+0

Ahm ... Cosa? Sì, è esattamente quello che vorrei in certi casi. Non si rivolge alla domanda –

+0

supponendo che asini, scimmie e uccelli derivino tutti da "Animale", quindi ... qual è il problema per archiviarli in un 'ArrayList ' ?? e ... dove è il potenziale disastro? –

+0

Non mi aspetto di essere così stupido. mi dispiace ... risposta più aggiornata – Ahmad

Problemi correlati