为什么<string,string =“”>条目允许HashMap <integer,string =“”>()?

时间:2016-04-26 10:01:02

标签: java

我有HashMap泛型类型<Integer, String>,即密钥应为Integer,此HashMap的值应为String。 我编写了下面的代码,它放置String并且没有编译和运行时错误。为什么呢?

Map map = new HashMap<Integer, String>();
map.put("a", "one");
System.out.println(map);

输出:

{a=one}

4 个答案:

答案 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'