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

128

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

gklots
источник
ваш выбор слов для вашего вопроса сбивает с толку, вы можете уточнить? А что именно не работает, можно код выложить?
Энтони Форлони,

Ответы:

204

Вы не можете использовать примитивные типы в качестве универсальных аргументов в Java. Вместо этого используйте:

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

При автоматической упаковке / распаковке разница в коде небольшая. Автобокс означает, что вы можете написать:

myMap.put("foo", 3);

вместо того:

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

Автоматическая упаковка означает, что первая версия неявно преобразуется во вторую. Автоматическая распаковка означает, что вы можете написать:

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

вместо того:

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

Неявный вызов intValue()означает, что если ключ не найден, он сгенерирует NullPointerException, например:

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

Причина - стирание шрифта . В отличие, скажем, от C # общие типы не сохраняются во время выполнения. Они просто «синтаксический сахар» для явного приведения, чтобы избавить вас от этого:

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
Ваш последний пример не работает: невозможно преобразовать Map <String, Integer> в Map <Integer, String>
T3rm1
учитывая каждый отдельный код в новой строке, код в строке 5 должен быть сначала преобразован в Integer перед использованием метода intValue (), поскольку он рассматривается как объект, когда вы используете метод get ().
свежий ученик
2

Вы не можете использовать примитивные типы в HashMap. int, или doubleне работают. Вы должны использовать его охватывающий тип. для примера

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

Теперь оба объекта, так что это сработает.


источник
0

ИНТ примитивный тип, вы можете прочитать , что это значит примитивный тип в Java здесь , и карта является интерфейсом , который имеет на объекты в качестве входных данных:

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

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];
Юнес Мериджи
источник
-3

Вы можете использовать ссылочный тип в общих аргументах, а не примитивный тип. Итак, здесь вы должны использовать

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

и сохранить значение как

myMap.put("abc", 5);
Читрапал Сингх
источник
1
Это не ответ на вопрос
smac89