2015-03-19 3 views

risposta

16

Il punto interrogativo (?) Rappresenta un tipo sconosciuto.

Nel tuo esempio, Map<Key, ?>, significa che sarà corrispondere a una mappa contenente valori di qualsiasi tipo. È non significa che è possibile creare un Map<Key, ?> e inserire valori di qualsiasi tipo in esso.

Citando dal documentation: (?)

Nel codice generico, il punto interrogativo, chiamato il jolly, rappresenta un tipo sconosciuto. Il carattere jolly può essere utilizzato in una varietà di situazioni: come tipo di parametro, campo o variabile locale; a volte come un tipo di ritorno (anche se è meglio che la pratica di programmazione sia più specifica). Il carattere jolly non viene mai utilizzato come argomento di tipo per una chiamata di metodo generica, una creazione di istanza di classe generica o un supertipo.

Per esempio, diciamo che si desidera creare una funzione che stamperà i valori di qualsiasi mappa, indipendentemente dai tipi di valore:

static void printMapValues(Map<String, ?> myMap) { 
    for (Object value : myMap.values()) { 
     System.out.print(value + " "); 
    } 
} 

Quindi chiamare questa funzione passando un Map<String, Integer> come argomento:

Map<String, Integer> myIntMap = new HashMap<>(); 
myIntMap.put("a", 1); 
myIntMap.put("b", 2); 
printMapValues(myIntMap); 

E si otterrebbe:

1 2 

Il jolly consente di chiamare il stessa funzione passando un Map<String, String>, o qualsiasi altro tipo di valore, come argomento:

Map<String, String> myStrMap = new HashMap<>(); 
myStrMap.put("a", "one"); 
myStrMap.put("b", "two"); 
printMapValues(myStrMap); 

Risultato:

one two 

Questo jolly si chiama sconfinata, dal momento che non fornisce informazioni sul tipo. Ci sono un paio di scenari in cui si consiglia di utilizzare il jolly illimitata:

  • Se chiami nessun metodo ad eccezione di quelli definiti nella classe Object.
  • Quando si utilizzano metodi che non dipendono dal parametro type, ad esempio Map.size() o List.clear().

Un carattere jolly può essere illimitata, superiore delimitata, o abbassare delimitata:

  • List<?> è un esempio di un jolly illimitata. Rappresenta un elenco di elementi di tipo sconosciuto.

  • List<? extends Number> è un esempio di carattere jolly con limite superiore . Corrisponde a un List di tipo Number e ai relativi sottotipi, ad esempio Integer o Double.

  • List<? super Integer> è un esempio di carattere jolly con limite inferiore . Corrisponde a un List di tipo Integer, nonché ai suoi supertipi, Number e Object.

1

La sconosciuta jolly

? può essere qualsiasi dataType

List<?> affatto un elenco digitato per un tipo sconosciuto, questo potrebbe essere un elenco, una lista, un elenco ecc

Ora per il tuo esempio Map<Key,?> significa che Value che deve essere inserito in questa mappa può essere di qualsiasi tipo di dati.