java: HashMap <String, int> не працює


128

HashMap<String, int>Схоже, не працює, але HashMap<String, Integer>працює. Будь-які ідеї чому?


Ваш вибір слів для вашого питання заплутаний, ви можете уточнити? І саме те, що не працює, можете розмістити код?
Ентоні Форлоні

Відповіді:


203

Ви не можете використовувати примітивні типи як загальні аргументи на 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>

об'єкт означає клас, а це означає також, що ви можете створити інший клас, який закінчується з нього, але ви не можете створити клас, який закінчується з 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.