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


128

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


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

Ответы:


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.