java: HashMap <String, int> non funziona


128

HashMap<String, int>non sembra funzionare ma HashMap<String, Integer>funziona. Qualche idea sul perché?


la tua scelta di parole per la tua domanda è confusa, puoi chiarire? Ed esattamente cosa non funziona, puoi pubblicare il codice?
Anthony Forloney,

Risposte:


203

Non è possibile utilizzare tipi primitivi come argomenti generici in Java. Usa invece:

Map<String, Integer> myMap = new HashMap<String, Integer>();

Con l' auto-box / unboxing c'è poca differenza nel codice. La boxe automatica significa che puoi scrivere:

myMap.put("foo", 3);

invece di:

myMap.put("foo", new Integer(3));

Auto-boxing significa che la prima versione viene convertita implicitamente nella seconda. Unboxing automatico significa che puoi scrivere:

int i = myMap.get("foo");

invece di:

int i = myMap.get("foo").intValue();

La chiamata implicita a intValue()significa che se la chiave non viene trovata genererà un NullPointerException, ad esempio:

int i = myMap.get("bar"); // NullPointerException

Il motivo è la cancellazione del tipo . Diversamente, diciamo, in C # i tipi generici non vengono mantenuti in fase di esecuzione. Sono solo "zuccheri sintattici" per il cast esplicito che ti salva facendo questo:

Integer i = (Integer)myMap.get("foo");

Per fare un esempio, questo codice è perfettamente legale:

Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");

3
Il tuo ultimo esempio non funziona: impossibile eseguire il cast dalla mappa <stringa, numero intero> alla mappa <numero intero, stringa>
T3rm1

considerando ogni codice separato in una nuova riga, il codice nella riga 5 deve essere prima inserito in Integer prima di utilizzare il metodo intValue () poiché viene considerato come un oggetto quando si utilizza il metodo get ().
studente fresco


2

Non puoi usare tipi primitivi in HashMap. into doublenon funziona. Devi usare il suo tipo di allegato. per un esempio

Map<String,Integer> m = new HashMap<String,Integer>();

Ora entrambi sono oggetti, quindi funzionerà.


0

int è un tipo primitivo, puoi leggere cosa significa un tipo primitivo in java qui , e una mappa è un'interfaccia che deve inserire gli oggetti come input:

public interface Map<K extends Object, V extends Object>

oggetto significa una classe e significa anche che è possibile creare un'altra classe che ne deriva, ma non è possibile creare una classe che esca da int. Quindi non puoi usare la variabile int come oggetto. Ho soluzioni di rimorchio per il tuo problema:

Map<String, Integer> map = new HashMap<>();

o

Map<String, int[]> map = new HashMap<>();
int x = 1;

//put x in map
int[] x_ = new int[]{x};
map.put("x", x_);

//get the value of x
int y = map.get("x")[0];

-3

È possibile utilizzare il tipo di riferimento negli argomenti generici, non il tipo primitivo. Quindi qui dovresti usare

Map<String, Integer> myMap = new HashMap<String, Integer>();

e memorizzare il valore come

myMap.put("abc", 5);

1
Questo non risponde alla domanda
smac89
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.