java: HashMap nie działa

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

 131
Author: skaffman, 2009-11-22

5 answers

Nie można używać typów prymitywnych jako ogólnych argumentów w Javie. Użyj zamiast:

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

Z auto-boxing / unboxing jest niewielka różnica w kodzie. Auto-Boks czyli można pisać:

myMap.put("foo", 3);

Zamiast:

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

Auto-Boks oznacza, że pierwsza wersja jest domyślnie przekonwertowana na drugą. Auto-unboxing oznacza, że możesz napisać:

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 a NullPointerException, na przykład:

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

Powodem jest wymazanie typu . W przeciwieństwie do, powiedzmy, w C#, typy generyczne nie są zachowywane w czasie wykonywania. Są one po prostu "cukrem składniowym" do wyraźnego odlewania, aby zaoszczędzić Ci robiąc to: {]}

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");
 208
Author: cletus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-23 00:06:47

GNU Trove wspiera to, ale nie używa generyków. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html

 4
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-23 07:03:34

Nie można używać prymitywnych typów w HashMap. int, lub double nie działają. Musisz użyć jego typu. dla przykładu

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

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

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 04:25:58

Int jest typem prymitywnym, możesz przeczytać co oznacza typ prymitywny w Javie tutaj , A Mapa jest interfejsem, który ma obiekty jako wejście:

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

Obiekt oznacza klasę, A to oznacza również, że można utworzyć inną klasę, która z niej wychodzi, ale nie można utworzyć klasy, która wychodzi z int. Nie można więc używać zmiennej int jako obiektu. Mam rozwiązania holownicze 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];
 1
Author: Younes Meridji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-25 23:18:09

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

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

I przechowuj wartość jako

myMap.put("abc", 5);
 -3
Author: Chitrapal Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 04:45:04