2010-05-20 18 views

risposta

6

Quando si assegna a una variabile (Set<T>) con un tipo generico non jolly T , l'oggetto assegnato deve avere esattamente T come tipo generico (compresi tutti i parametri di tipo generico di T, jolly e non jolly). Nel tuo caso T è Cage<Lion>, che non è dello stesso tipo di Cage<? extends Animal>.

Che cosa si può fare, perché Cage<Lion> è assegnabile a Cage<? extends Animal>, è utilizzare il tipo di carattere jolly:

Set<? extends Cage<? extends Animal>> a = new Set<Cage<Lion>>(); 
+0

+1 per la soluzione reale. –

+0

Grazie, per me, quella era la parte mancante. –

6

Questo è sbagliato, perché se fosse permesso, allora questo sarebbe legale:

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); 
cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal> 

Cage<Tiger> è entro i limiti della dichiarazione, ma non la definizione, quindi questo potrebbe andare in crash.

+0

Come può Java decidere se applicare controvarianza/covarianza o no? – Simon

+0

Comprensione Java considera i generici come invariabili (ma, in modo bizzarro, tratta gli array come controlli covarianti e di tipo in fase di esecuzione) ma scrivendo metodi con parametri jolly appropriati (estendi o super appropriati) e un po 'di cast e sopprimendo le conversioni non controllate, può dare l'impressione di ciò che è appropriato nel tuo caso. – pdbartlett

2

è necessario scaricare:

Set<? extends List<? extends Number>> cc = new HashSet<ArrayList<Integer>>(); 

di spiegare perché ... Credo che il backup su una versione più semplice del vostro esempio:

Number a = new Integer(1); // OK 
Set<Number> b = new HashSet<Integer>(); // not OK 

questo non funziona perché permetterebbe

b.add(new Double(3.0)); 
Problemi correlati