Essenzialmente List<? extends String>
è un elenco di un tipo sconosciuto, tutto ciò che si sa è che questo tipo si estende String. Non importa che la variabile contenga un'istanza di List<String>
.
Ora String è definitiva, quindi non c'è alcun sottoclasse ... quindi prendiamo in considerazione:
List<? extends A> list = new ArrayList<A>();
dove A
è una certa classe con una sottoclasse B
. Se utilizzata, una variabile di tipo List<? extends A>
potrebbe essere un'istanza di List<B>
. Non è possibile aggiungere A
perché esiste la possibilità che lo A
non sia un B
.
Ma sai che sarà giusto? Bene, il compilatore non, né anticipa le connessioni logiche tra il tipo sconosciuto e ciò che hai istanziato, perché in generale puoi cambiare quella variabile in fase di runtime.
Un esempio simile esiste nel tutorial ottimisticamente chiamato More Fun with Wildcards, dove un metodo accetta (Set<T>, T)
e una chiamata è illegale preposed utilizzando (Set<?>, String)
se la variabile Set<?>
contiene un'istanza di Set<String>
. Il problema è lo stesso qui, nonostante l'aggiunta di extends
.
Non ha senso, poiché 'String' è una classe ** finale **! Non esiste una classe che possa estendere 'String'. Quindi, l'unica cosa che dovresti fare è definirla come 'Lista'. –
bobbel
ma come sta prendendo il riferimento di ArrayList che ha String come oggetto? –
Perché 'Lista' soddisfa 'Elenco estende String> '. La differenza è * String is a String * ma * String may not be a? quella è una stringa *. –
Linus