2009-09-25 22 views
8

Scusate se il titolo sembra confuso, ma alcuni esempi sono in ordine.Perché non è possibile un tipo generico che contiene un tipo generico essere assegnato ad una classe tipizzata generico di tipo jolly

Diciamo che ho un po 'di classe Java con un parametro di tipo generico:

public class GenericClass<T> { 
} 

posso creare una variabile digitato per memorizzare un oggetto, con il parametro generico impostato, dire una String. Java sarà inoltre mi permette di assegnare tale variabile ad un'altra variabile, ma con il parametro generico impostato il tipo jolly <?>:

GenericClass<String> stringy = ... 
GenericClass<?> generic = stringy; // OK 

Tuttavia, quando si lavora con una classe con un parametro generico, se si imposta il tipo di quel parametro per essere generico, non si può quindi assegnare un oggetto di quella classe per un tipo identico digitato/genericized dove il parametro quest'ultimo (interno/annidata) è del tipo jolly <?>:

GenericClass<GenericClass<String>> stringy = ... 
GenericClass<GenericClass<?>> generic = stringy; // Compile Error 

// And just in case that is confusing, a more 
// realistic example involving Collections: 
List<GenericClass<String>> stringy = ... 
List<GenericClass<?>> generic = stringy; // Compile Error 

l'errore di compilazione specifico è :

Type mismatch: cannot convert from List<GenericClass<String>> to List<GenericClass<?>> 

Intuitivamente penserei che la cessione in questione non dovrebbe essere un problema. Allora, perché questo incarico è un problema?

+0

duplicati di http://stackoverflow.com/questions/1341093/nested-generics-with-wildcards – Dirk

risposta

8

Il problema vostro rivestimento è denominato Covariance.

List<GenericClass<String>> stringy = ... 
List<GenericClass<?>> generic = stringy; 
generic.add(new GenericClass<Integer>()); 

Se questo non era un errore di compilazione, l'ultima riga di codice sarebbe possibile.

Si potrebbe aggirare l'errore in questo modo:

List<? extends GenericClass<?>> generic = stringy; 

ma non è possibile utilizzare add anche perché non so davvero che cosa è ? extends GenericClass<?> (Covariance ancora una volta). In questo caso puoi solo elencare attraverso l'Elenco e aspettarti GenericClass<?>.

4

Tecnicamente, questo perché List<GenericClass<String>> non è un sottotipo di List<GenericClass<?>>. Per farlo funzionare, si potrebbe fare qualcosa di simile

List<? extends GenericClass<?>> generic = stringy 

che dovrebbe funzionare come previsto (anche se è abbastanza brutto ...).

Vedi, per esempio, this SO question per maggiori dettagli

Problemi correlati