HashMap<String, int>
, похоже, не работает, но HashMap<String, Integer>
работает.
Любые идеи, почему?
Java: HashMap <String, int> не работает
Ответ 1
Вы не можете использовать примитивные типы в качестве общих аргументов в Java. Вместо этого используйте
Map<String, Integer> myMap = new HashMap<String, Integer>();
С auto-boxing/unboxing в коде мало различий. Авто-бокс означает, что вы можете написать:
myMap.put("foo", 3);
вместо:
myMap.put("foo", new Integer(3));
Авто-бокс означает, что первая версия неявно преобразуется во вторую. Auto-unboxing означает, что вы можете написать:
int i = myMap.get("foo");
вместо:
int i = myMap.get("foo").intValue();
Неявный вызов intValue()
означает, что если ключ не найден, он будет генерировать NullPointerException
, например:
int i = myMap.get("bar"); // NullPointerException
Причина type erasure. В отличие от, скажем, в С# общие типы не сохраняются во время выполнения. Это просто "синтаксический сахар" для явного кастинга, чтобы вы это делали:
Integer i = (Integer)myMap.get("foo");
Чтобы дать вам пример, этот код совершенно легален:
Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");
Ответ 2
GNU Trove поддерживает это, но не использует дженерики. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html
Ответ 3
Вы не можете использовать примитивные типы в HashMap
. int
или double
не работают. Вы должны использовать свой закрытый тип. для примера
Map<String,Integer> m = new HashMap<String,Integer>();
Теперь оба объекта, поэтому это будет работать.
Ответ 4
ИНТ примитивный тип, вы можете прочитать, что действительно означает примитивный тип в Java здесь, и карта является интерфейсом, который имеет на объекты в качестве входных данных:
public interface Map<K extends Object, V extends Object>
Объект означает класс, и это также означает, что вы можете создать другой класс, который расширяется из него, но вы не можете создать класс, который расширяется из int. Таким образом, вы не можете использовать переменную int в качестве объекта. У меня есть решения для вашей проблемы:
Map<String, Integer> map = new HashMap<>();
или же
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];
Ответ 5
Вы можете использовать ссылочный тип в общих аргументах, а не в примитивном типе. Поэтому здесь вы должны использовать
Map<String, Integer> myMap = new HashMap<String, Integer>();
и сохранить значение как
myMap.put("abc", 5);