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?
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?
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)
Perché non viene compilato anche questo? 'Elenco estende la mappa
È, ancora, perché dovresti aggiungere elementi alla tua raccolta generica con caratteri jolly' a'. – DerMike
Poiché si tenta di aggiungere una raccolta definita con carattere jolly e che non è consentita in Java. – arjacsoh
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.
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);
}
è possibile farlo utilizzando un metodo come:
private <S extends Map<String, ?>> void method(List<S> a, List<S> b){
a.addAll(b);
}
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.
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);
}
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