java: HashMap <String, int> nie działa

128

HashMap<String, int>nie wydaje się działać, ale HashMap<String, Integer>działa. Jakieś pomysły, dlaczego?

gklots
źródło
Twój dobór słów do pytania jest mylący, czy możesz to wyjaśnić? A co dokładnie nie działa, czy możesz wysłać kod?
Anthony Forloney

Odpowiedzi:

203

W Javie nie można używać typów pierwotnych jako argumentów ogólnych. Użyj zamiast tego:

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

W przypadku automatycznego pakowania / rozpakowywania istnieje niewielka różnica w kodzie. Auto-boxing oznacza, że ​​możesz pisać:

myMap.put("foo", 3);

zamiast:

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

Automatyczne boksowanie oznacza, że ​​pierwsza wersja jest niejawnie konwertowana na drugą. Automatyczne rozpakowywanie oznacza, że ​​możesz pisać:

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

zamiast:

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

Niejawne wywołanie intValue()oznacza, że ​​jeśli klucz nie zostanie znaleziony, wygeneruje NullPointerException, na przykład:

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

Powodem jest wymazywanie typów . W przeciwieństwie do, powiedzmy, w C # typy ogólne nie są zachowywane w czasie wykonywania. Są po prostu „cukrem syntaktycznym” dla jawnego rzucania, aby zaoszczędzić ci tego:

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

Aby dać ci przykład, ten kod jest całkowicie legalny:

Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");
cletus
źródło
3
Twój ostatni przykład nie działa: nie można
przesyłać
biorąc pod uwagę każdy oddzielny kod w nowej linii, kod w linii 5 musi być najpierw rzutowany na Integer przed użyciem metody intValue (), ponieważ jest on traktowany jako obiekt, gdy używasz metody get ().
świeży uczeń
2

W programie nie można używać typów pierwotnych HashMap. intlub doublenie działa. Musisz użyć jego typu otaczającego. dla przykładu

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

Teraz oba są obiektami, więc to zadziała.


źródło
0

int jest typem prymitywnym, możesz przeczytać, co oznacza typ prymitywny w java tutaj , a Map to interfejs, który ma obiekty jako dane wejściowe:

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

obiekt oznacza klasę, a to oznacza również, że możesz stworzyć inną klasę, która się od niej wywodzi, ale nie możesz stworzyć klasy, która wykracza poza int. Nie możesz więc używać zmiennej int jako obiektu. Mam rozwiązania dla twojego problemu:

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

lub

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];
Younes Meridji
źródło
-3

Możesz użyć typu referencyjnego w argumentach ogólnych, a nie typu pierwotnego. Więc tutaj powinieneś użyć

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

i zapisz wartość jako

myMap.put("abc", 5);
Chitrapal Singh
źródło
1
To nie odpowiada na pytanie
smac89