我对Java中的泛型有一个基本问题:地图的以下两个初始化之间有什么区别?
Map<String, String> maplet1 = new HashMap<String, String>();
Map<String, String> maplet2 = new HashMap();
我理解第一次初始化是指定对象构造中的泛型,但我不理解这样做的潜在后果,而不是后一种对象构造(maplet2)。在实践中,我总是看到代码使用了maplet1构造,但是我不明白在另一个上面做这件事会有什么好处。
答案 0 :(得分:5)
第二个Map
被分配给原始类型,并将导致编译器警告。您只需使用第一个版本即可消除警告。
答案 1 :(得分:2)
第一个是类型安全的。
您可以使用diamond operator <>
来缩写右侧。该运算符从赋值的左侧推断出类型参数。
Map<String, String> maplet2 = new HashMap<>();
答案 2 :(得分:1)
让我们理解Erasure的概念。在RUNTIME HashMap<String, String>()
和HashMap()
是由HashMap表示的。
将HashMap<String,String>
转换为HashMap
(原始类型)的过程称为Erasure。
如果不使用泛型,每次都必须将Map中的值强制转换为String。
泛型的使用迫使你消除演员阵容。
如果您不使用泛型,则Future Developer很可能会插入另一种类型的Object,这将导致ClassCastException