2013-08-30 11 views
5

PerchéCome utilizzare addAll con raccolta generica?

List<Map<String, Object>> a, b; 
a.addAll(b); 

compilare

Ma

List<? extends Map<String, ?>> a, b; 
a.addAll(b); 

non lo fa.

Come compilare quest'ultimo?

+0

Scambio '?estende la mappa 'per un tipo che estende' Map 'perché quando si dichiarano le variabili è necessario fornire loro un tipo. Se non è necessario utilizzare interfacce come nel primo esempio. – LuigiEdlCarno

risposta

2

Non è possibile aggiungere elementi a un elenco generico di caratteri jolly. Il primo si compila perché ha un tipo definito.

Si può, tuttavia, trovare qualche super classe che si adatta al tuo scopo e usarlo come argomento generico.

UPDATE:

vedi anche Wildcard (in the Oracle docs)

+0

Perché non viene compilato anche questo? 'Elenco > a; ' ' Elenco > b; ' ' a.addAll (b); ' – Pinch

+1

È, ancora, perché dovresti aggiungere elementi alla tua raccolta generica con caratteri jolly' a'. – DerMike

+0

Poiché si tenta di aggiungere una raccolta definita con carattere jolly e che non è consentita in Java. – arjacsoh

0

Quando si dichiara con cemento tipo generico, si compila. Se si definisce una classe:

public class AClass<T extends Map<String, ?>> { 

    public List<T> dostuff() { 

     List<T> lista = new ArrayList<T>(); 
     List<T> listb = new ArrayList<T>(); 

     lista.addAll(listb); 
     return lista; 
    } 
} 

Con i caratteri jolly non è possibile compilare.

1

Secondo java docs è possibile dichiarare metodo di supporto in questo caso (brutto ma funziona):

static <T extends List<K>, V, K extends Map<String, V>> void addAllHelper(T from, T to) { 
     from.addAll(to); 
} 
0

è possibile farlo utilizzando un metodo come:

private <S extends Map<String, ?>> void method(List<S> a, List<S> b){ 
    a.addAll(b); 
} 
2

Immaginate che CustomHashMap estende HashMap e si inizializza a come segue:

List<CustomHashMap<String, String> list = new ArrayList<CustomHashMap<String, String>>(); 
List<? extends Map<String, ?>> a = list; 

se tu fossi in grado di aggiungere voci al a ...

a.add(new HashMap<String, String>()); 

... si sarebbe incontrare questa strana situazione

CustomHashMap<String, String> map = list.get(0); // you would expect to get CustomHashMap object but you will get a HashMap object instead 

In altre parole, non si conosce il tipo effettivo di te Mappa (quando dici? estende Map), tutto ciò che sai è che si tratta di un sottotipo di Map e non puoi aggiungere oggetti arbitrari alla List perché devi assicurarti che ci sia un supertipo per l'oggetto aggiunto. Ma non puoi, dal momento che il tipo esatto della Mappa è sconosciuto.

0

Di seguito il codice dovrebbe aiutare a spiegare questo

List<? super Number> una si chiama parametro out e può essere utilizzato per gli aggiornamenti List<? extends Number> b si chiama in parametro e può essere utilizzato per leggere

linee di seguito commentati i risultati in errore di compilazione per il motivo indicato nei commenti

public static void main(String[] args) { 
    List<Integer> intList = new ArrayList<>(); 
    List<Double> doubleList = new ArrayList<>(); 
    List<Number> numberList = new ArrayList<>(); 
    addAll(numberList, intList); 
    addAll(numberList, doubleList); 
    addAll(intList, doubleList);//cant add double to int 
    addAll(doubleList,intList);//cant add int double 
    addAll(intList, numberList);//cant add number to int 
} 

private static<T> void addAll(List<? super T> a, List<? extends T> b) { 
    a.addAll(b); 
} 
Problemi correlati