4

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

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

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

我知道第一个初始化是在对象构造中指定泛型,但我不了解这样做的潜在后果,而不是后一个对象构造(maplet2)。在实践中,我总是看到代码使用 maplet1 构造,但我不明白这样做比其他方法有什么好处。

4

3 回答 3

5

第二个Map分配给原始类型并将导致编译器警告。您可以简单地使用第一个版本来消除警告。

有关更多信息,请参阅:什么是原始类型,为什么我们不应该使用它?

于 2013-02-27T23:45:56.980 回答
2

第一个是类型安全的。

您可以使用菱形运算符 来简写右侧<>。此运算符从赋值的左侧推断类型参数。

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

于 2013-02-27T23:47:04.810 回答
1

让我们了解擦除的概念。在 RUNTIMEHashMap<String, String>()HashMap()用 HashMap 表示的都是一样的。

转换HashMap<String,String>HashMap(原始类型)的过程称为擦除。

如果不使用 Generics ,您必须每次都将 Map 中的值明确地转换为 String 。

泛型的使用迫使你消除演员阵容。

如果您不使用 Generics ,未来开发人员很可能会插入另一种类型的 Object ,这将导致 ClassCastException

于 2013-02-27T23:51:29.483 回答