2013-09-05 2 views
6

L'errore:Perché non è possibile aggiungere Stringa per digitare nell'elenco <?>?

The method add(capture#1-of ?) in the type List<capture#1-of ?> is not 
applicable for the arguments (String) 

Codice:

List<?> to = new ArrayList<Object>(); 
to.add(new String("here")); 

Dal List<?> è un tipo elenco generico e quindi può essere di qualsiasi tipo, allora perché non accetta String nel metodo add?

+1

Sì, e quel commento non ha alcun rapporto alla domanda;) –

risposta

11

A List<?> è un elenco di alcuni tipi, che è sconosciuto. Così non si può aggiungere nulla ad esso, tranne nulla senza rompere il tipo di sicurezza della lista:

List<Integer> intList = new ArrayList<>(); 
List<?> unknownTypeList = intList; 
unknownTypeList.add("hello"); // doesn't compile, now you should see why 
6

should a String not be acceptable ?

n <?> significa che il tipo è sconosciuto e il compilatore non può essere sicuri che qualsiasi tipo è accettabile per aggiungere (questo include String)

0

È possibile considerare qualsiasi elenco definito utilizzando i caratteri jolly per essere leggi solo. Tuttavia, ci sono alcune operazioni non leggere che puoi fare.

Da the docs:

  • È possibile aggiungere nulla.
  • È possibile richiamare chiaro.
  • È possibile ottenere l'iteratore e richiamare rimuovere.
  • È possibile acquisire il carattere jolly e scrivere gli elementi che si sono letti dall'elenco.
1

Secondo wildcards, the question mark (?), called the wildcard, represents an unknown type e non un tipo generico, fin dalla sua un tipo unknown il compilatore non può accettare String nel tuo caso.

2

È possibile specificare un limite inferiore:

List<? super Object> to = new ArrayList<Object>(); 
to.add(new String("here")); // This compiles 

Ora il compilatore è sicuro che l'elenco può contenere qualsiasi oggetto

Problemi correlati