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;