我有HashMap
泛型类型<Integer, String>
,即密钥应为Integer
,此HashMap的值应为String
。
我编写了下面的代码,它放置String
并且没有编译和运行时错误。为什么呢?
Map map = new HashMap<Integer, String>();
map.put("a", "one");
System.out.println(map);
输出:
{a=one}
答案 0 :(得分:3)
我有HashMap的泛型类型&lt; Integer,String&gt; ...
不,你没有!
Map map = new HashMap<Integer, String>();
表示您只有Map
(因为Map map =
)。如果您需要Map<Integer, String>
,则必须使用:
Map<Integer, String> map = new HashMap<Integer, String>();
或者,在Java的更高版本中
Map<Integer, String> map = new HashMap<>();
原因是作业的右侧是单独的过程并首先进行评估。在您的情况下,它会创建一个HashMap<Integer, String>
。
接下来,分配发生,编译器检查HashMap<Integer, String>
是否可以强制转换为Map
(等同于Map<Object,Object>
BTW)并执行分配。从那时起,对map
的所有引用将其视为Map<Object,Object>
类型,因此可以为键或值保留任何类型。
答案 1 :(得分:2)
您正在向声明的Map map
添加内容,而不指定任何泛型类型。
如果您以这种方式声明地图,则编译器不知道如何检查地图内容。
如果您将地图声明更改为
Map<Integer, String> map = new HashMap<>();
然后您将遇到编译错误。
答案 2 :(得分:1)
Map map = new HashMap<Integer, String>();
此处您的定义是指定的类型,但声明不是。因此,您可以将任何类型添加到map
。
通用地图声明的正确方法是
Map<Integer, String> map = new HashMap<Integer, String>();
或在Java的新版本中,您可以跳过确定类型。
Map<Integer, String> map = new HashMap<>();
答案 3 :(得分:1)
在右侧定义泛型或多或少是过时的(灰色字体)。
以下代码无法编译:
Map<Integer, String> map = new HashMap<>();
map.put("a", "one");
System.out.println(map);
有了这个解释:
错误的第一个参数类型。找到:'java.lang.String',必需:'java.lang.Integer'