原文: https://howtodoinjava.com/java7/improved-type-inference-in-java-7/

Java 7 之前,在使用泛型时,我们必须为变量类型及其实际类型提供类型参数。 现在,此新的 Java 7 特性已使它有所缓解。 声明右侧的空白 Java 菱形运算符可以正常工作。

菱形运算符用两个角度'< >'表示。

1. 在泛型之前 – 原始类型声明

如果您使用的是 Java 的早期版本(1.5 之前的版本),则当泛型不是 Java 特性时,开发人员必须使用原始类型声明和初始化。 例如,下面给出的是HashMap声明。

  1. Map params = new HashMap();

这种方法的问题是,您可以将任何对象类型放入键和值中,并且只有在运行时,如果对象不是所需类型,您将得到错误。 没有可以警告开发人员的编译时安全性,即哪些类型允许,哪些类型不允许。

2. 泛型 – 参数化类型

JDK 1.5 带来了泛型。 它必须具有许多急需的特性,并且完全改变了开发人员编写代码的方式。 它启用了编译时安全性。 它有助于大量减少运行时错误。

  1. Map<String, Integer> params = new HashMap<String, Integer>();

该语法解决了编译时类型安全性的问题。 实际上,以上语法几乎适用于所有用例。 在上面的示例中,如果尝试添加任何其他类型的键或值,则编译器将给您错误。

您需要修复代码才能通过编译器。

3. 菱形运算符

参数化类型可以解决问题,但由于双方重复使用相同的类型信息,因此看起来很繁琐。 如果我们可以在一侧提供类型信息,而另一侧可以检测并应用类型信息,则可以减少语法。

Java 中的菱形运算符执行完全相同的操作。 也称为 Elvis 运算符。 在下面查看菱形运算符语法

  1. Map<String, Integer> params = new HashMap<>();

在上面的代码中,编译器足够聪明,可以识别菱形运算符推断声明左侧的类型。 它将类型信息也应用于右侧对象。 它有助于向 Java 添加类型推断特性。

4. 向后兼容性

为了向后兼容,原始类型和参数化类型仍然存在。 但是,新编译器会在看到原始类型时发出警告。 如果从 Java 5 开始编译原始类型,则会收到如下警告:

  1. ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

学习快乐!

阅读更多:

维基中的菱形运算符