Java: HashMap <String, int> не работает

HashMap<String, int>, похоже, не работает, но HashMap<String, Integer> работает. Любые идеи, почему?

Ответ 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");

Ответ 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);