2016-01-15 5 views
5

Scusami per il titolo di domanda così generico, ma non ero sicuro di come chiamare correttamente la mia domanda.Generici Java con caratteri jolly e wrapper statici

vedere i tipi predefiniti di risultato di Collections.singleton chiamate:

Set<Number> numberSingleton = 
    Collections.singleton((Number) null); 

Set<Collection> rawCollectionSingleton = 
    Collections.singleton((Collection) null); 

Set<Collection<String>> stringCollectionSingleton = 
    Collections.singleton((Collection<String>) null); 

Set<? extends Collection<?>> anyCollectionSingleton = 
    Collections.singleton((Collection<?>) null); 

Quello che non riesco a spiegare è l'ultima riga. Perché viene utilizzato ? extends Collection<?> invece del semplice Collection<?>?

È una correzione corretta per questo?

Set<Collection<?>> anyCollectionSingleton = 
    Collections.<Collection<?>>singleton((Collection<?>) null); 

perché ho iniziato tutto questo:

ho avuto un problema con la linea non la compilazione:

java.util.Optional.ofNullable((Collection<?>) a).orElse((Collection<?>) b); 

Questo sembra risolvere il problema, ma qual è il prezzo?

java.util.Optional.<Collection<?>>ofNullable((Collection<?>) a).orElse((Collection<?>) b); 
+0

La tua domanda riguarda perché l'IDE genera questo tipo strano? Perché Set > singleton = Collections.singleton ((Collezione ) null); funziona bene – AdamSkywalker

+0

Oracle JDK 1.8.0_40 mi dà errore di compilazione 'java: tipi incompatibili: java.util.Set > non può essere convertito in java.util.Set > '. Quale versione di Java usi? – Gedrox

+0

ultimo, 1.8.0_66 – AdamSkywalker

risposta

0

No, è un concetto completamente diverso.

Quello che dovrà essere utilizzato con

Set<? extends Collection<?>> anyCollectionSingleton = 
Collections.singleton((Collection<?>) null); 

è che avete una classe generica che si estende una collezione di classi generiche.

Quindi, si tratta di ereditarietà.

+0

Ma perché il caso con 'Collection ' si comporta allo stesso modo? – Gedrox

+0

In generale, 'String' in qualcosa come una classe indipendente, poiché eredita direttamente dalla classe' Object', mentre per esempio la classe 'Integer' eredita da' Number'. È abbastanza per il tuo caso? Se intendevi qualcos'altro, un esempio potrebbe essere utile. – thodorisbais

+0

Intendevo perché 'Collection ' produce 'Set >' e non 'Set > 'come nel caso' Collection '? – Gedrox