java: HashMap<String, int> not working

HashMap<String, int> doesn't seem to work but HashMap<String, Integer> does work. Any ideas why?

289690 次浏览

在 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");

GNUTrove 支持这一点,但不使用泛型

可以在泛型参数中使用引用类型,而不是基元类型。 所以你应该用

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

并将价值储存为

myMap.put("abc", 5);

HashMap中不能使用基元类型。int或者 double都不起作用。你必须使用它的封闭类型。举个例子

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

现在两者都是对象,所以可以这样做。

Int 是一个基本类型,你可以读取 java 给你中基本类型的含义,而 Map 是一个接口,它必须将对象作为输入:

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];