Originariamente inviato da Hysoka
Vediamo se ho capito bene...se volessi fare una list (per esempio) di 'numeri', si dovrebbe fare
ArrayList<? extends Number> al = new ArrayList<? extends Number>();
No!! Innanzitutto il wildcard (bounded o unbounded che sia .. non importa) non può stare al livello "top" nella espressione della istanziazione di una classe (la parte new Blabla...).
codice:
ArrayList<? extends Number> al = new ArrayList<? extends Number>(); // NO
ArrayList<? extends Number> al = new ArrayList<Number>(); // OK
ArrayList<Vector<?>> al = new ArrayList<Vector<?>>(); // OK (il ? non è al "top" ma più interno)
Originariamente inviato da Hysoka
e qui posso piazzare double, float, int, etc.? Ovviamente, usando le classi wrapper
Per chiarire bene (perché credo/deduco che non ti sia ancora completamente chiaro):
1) Una cosa è il tipo di oggetti che si possono usare con un certo tipo parametrico.
Esempio:
Un ArrayList<Number> può tranquillamente contenere Integer, Double, Long, BigDecimal, ecc... Tutto ciò che è un Number.
codice:
ArrayList<Number> arr = new ArrayList<Number>();
arr.add(new Integer(12)); // OK
arr.add(new Double(20.34)); // OK
2) Un'altra cosa è la assegnazione di un tipo parametrizzato (con una istanziazione di un tipo "concreto" es. ArrayList<String> o con una istanziazione con wildcard es. ArrayList<? extends Number>) ad un tipo più generico.
Esempio:
ArrayList<Number> può essere assegnato a un ArrayList<? extends Number> o a un ArrayList<? extends Object> o a un ArrayList<? super Integer>
Perché ArrayList<Number> è un sottotipo dei 3 tipi citati sopra.
ArrayList<? extends Integer> può essere assegnato a un ArrayList<? extends Number> o a un ArrayList<? extends Object> o a un ArrayList<?>
Questo non vuol dire che puoi fare:
ArrayList<? extends Number> arr = new ArrayList<? extends Integer>(); // NOOOO (spiegato all'inizio)
Vuol dire che puoi fare ad esempio:
ArrayList<? extends Integer> arr = new ArrayList<Integer>();
ArrayList<? extends Number> arr2 = arr;