2016-01-30 25 views
5
List<? extends String> list = new Arraylist<String>(); 
list.add("foo"); 

Dato un pezzo di codice mi dà errore di compilazione error.i non capisco perché non riesco ad aggiungere una stringa in lista. ma il codice significa che siamo in grado di aggiungere l'oggetto classe String ed è oggetto di classe derivata nella lista ancora sto ottenendo l'errore perchéerrore di compilazione durante l'utilizzo di caratteri jolly nell'elenco

+1

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

+0

ma come sta prendendo il riferimento di ArrayList che ha String come oggetto? –

+0

Perché 'Lista ' soddisfa 'Elenco '. La differenza è * String is a String * ma * String may not be a? quella è una stringa *. – Linus

risposta

2

List<?> deve essere utilizzato solo quando non si è interessati con il tipo di dati degli oggetti e interessati a operazioni quali ottenere la dimensione della lista ecc

Per esempio,

public int getSize(List<?> itemList) { 
    return itemList.size(); 
} 

è più di una lista Read Only.

È necessario utilizzare quanto segue se si intende creare un nuovo elenco di articoli String.

List<String> list = new Arraylist<>(); 
list.add("foo"); 

In alternativa, è possibile utilizzare questo:

List<Object> list = new Arraylist<>(); 
list.add("foo"); 
1

Ciò funzionerà:

List<? super String> list = new ArrayList<String>(); 
list.add("foo"); 

Allora il vostro compilatore ora, che il chiamante è quello di passare un elenco di oggetti che sono String o un tipo super.

Quando dici <? extends String> significa che può essere di qualsiasi tipo che si estende String. Ciò significa che qualcuno può passare List e lo accetterà.

Guardate anche qui: Difference for <? super/extends String> in method and variable declaration

1

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.