首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java: HashMap<String,int>不工作

java: HashMap<String,int>不工作
EN

Stack Overflow用户
提问于 2009-11-23 07:21:49
回答 5查看 266.2K关注 0票数 136

HashMap<String, int>似乎不起作用,但HashMap<String, Integer>确实起作用。你知道为什么吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-23 07:23:09

在Java中,不能将原始类型用作泛型参数。请改用:

代码语言:javascript
复制
Map<String, Integer> myMap = new HashMap<String, Integer>();

使用auto-boxing/unboxing,代码几乎没有什么不同。自动装箱意味着你可以写:

代码语言:javascript
复制
myMap.put("foo", 3);

而不是:

代码语言:javascript
复制
myMap.put("foo", new Integer(3));

自动装箱意味着第一个版本被隐式转换为第二个版本。自动拆箱意味着你可以写:

代码语言:javascript
复制
int i = myMap.get("foo");

而不是:

代码语言:javascript
复制
int i = myMap.get("foo").intValue();

intValue()的隐式调用意味着如果找不到密钥,它将生成一个NullPointerException,例如:

代码语言:javascript
复制
int i = myMap.get("bar"); // NullPointerException

原因是type erasure。与C#不同的是,泛型类型在运行时不会被保留。它们只是显式强制转换的“语法糖”,可以省去你这样做的麻烦:

代码语言:javascript
复制
Integer i = (Integer)myMap.get("foo");

举个例子,这段代码是完全合法的:

代码语言:javascript
复制
Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");
票数 216
EN

Stack Overflow用户

发布于 2009-11-23 15:03:34

GNU Trove支持这一点,但不使用泛型。http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html

票数 5
EN

Stack Overflow用户

发布于 2016-09-09 12:25:59

不能在HashMap中使用基元类型。intdouble不起作用。你必须使用它的封闭类型。举个例子

代码语言:javascript
复制
Map<String,Integer> m = new HashMap<String,Integer>();

现在两者都是对象,所以这将会起作用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1780385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档