理解对象初始化中的泛型

时间:2013-02-27 23:39:49

标签: java generics object initialization

我对Java中的泛型有一个基本问题:地图的以下两个初始化之间有什么区别?

        Map<String, String> maplet1 = new HashMap<String, String>();

        Map<String, String> maplet2 = new HashMap();

我理解第一次初始化是指定对象构造中的泛型,但我不理解这样做的潜在后果,而不是后一种对象构造(maplet2)。在实践中,我总是看到代码使用了maplet1构造,但是我不明白在另一个上面做这件事会有什么好处。

3 个答案:

答案 0 :(得分:5)

第二个Map被分配给原始类型,并将导致编译器警告。您只需使用第一个版本即可消除警告。

有关详情,请参阅:What is a raw type and why shouldn't we use it?

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