请帮忙理解原因
Map map1 = new HashMap<String,String>(); // This compiles
Map<Object,Object> map2 = new HashMap<String,String>(); // This does not.
据我了解
Map map1
与
相同
Map<Object,Object> map1
---- 编辑----
当没有为引用 map1 提供泛型时,编译器接受使用任何泛型创建的对象。这对我来说似乎 map1 有隐含的
<Object,Object>
应用了泛型。
所以这里的问题是当map2有显式时为什么编译失败
<Object,Object>
应用了泛型。
对于反对者,标记为重复的问题不会直接回答我的问题。
感谢 Chetan 和 Pham,这解释了!!!
Map<Object,Object> map2 = new HashMap<String,String>();
As per my understanding
Map map1
is same as
Map<Object,Object> map1
没有。 Map
与 Map<Object,Object>
不同.
HashMap<T,T>
类型的引用是 Map
类型引用的子类型.换句话说,类型为 Map
的引用可以引用 HashMap<String,String>
类型的对象.
另一方面,类型为 HashMap<T,T>
的引用不是 Map<E,E>
类型引用的子类型(即使 T
是一个 E
和 HashMap
是一个 Map
)。换句话说,类型为 Map<Object,Object>
的引用不能引用 HashMap<String,String>
类型的对象即使String
是一个Object
和 HashMap
是一个Map
.
如果您想知道为什么在泛型情况下引用子类型的规则以这种方式工作,我可以根据我的理解给出一个解释。泛型是语法糖,经过所谓的type-erasure
。一旦代码被编译。即 HashMap<String,String>
编译后变成 HashMap
.
如果编译器允许语句 Map<Object,Object> map = new HashMap<String,String>
, 它会误导程序员相信 Map
只能容纳String
运行时的键和值。这将是荒谬的,因为泛型经历了 type-erasure
在编译时本身。
声明Map map = new HashMap<String,String>
另一方面,主要是为了与遗留代码向后兼容。