Nelle raccolte Java ho visto qualcosa del genere: Map<Key,?>
. Non so come funziona, qualcuno può aiutarmi con questo o fornire un esempio?Nella mappa delle collezioni Java <Key,?> Cosa significa "?" fare riferimento a?
risposta
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()
oList.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 unList
di tipoNumber
e ai relativi sottotipi, ad esempioInteger
oDouble
.List<? super Integer>
è un esempio di carattere jolly con limite inferiore . Corrisponde a unList
di tipoInteger
, nonché ai suoi supertipi,Number
eObject
.
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.