# Java 菱形运算符 – Java 中的`<>`运算符

> 原文： [https://howtodoinjava.com/java7/improved-type-inference-in-java-7/](https://howtodoinjava.com/java7/improved-type-inference-in-java-7/)

在 [Java 7](https://howtodoinjava.com/java7/java-7-changes-features-and-enhancements/) 之前，在使用[泛型](https://howtodoinjava.com/java/generics/complete-java-generics-tutorial/)时，我们必须为变量类型及其实际类型提供类型参数。 现在，此新的 Java 7 特性已使它有所缓解。 声明右侧的空白 **Java 菱形运算符**可以正常工作。

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

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

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

```java
Map params = new HashMap();

```

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

## 2\. 泛型 – 参数化类型

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

```java
Map<String, Integer> params = new HashMap<String, Integer>();

```

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

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

## 3\. 菱形运算符

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

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

```java
Map<String, Integer> params = new HashMap<>();

```

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

## 4\. 向后兼容性

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

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

学习快乐！

阅读更多：

维基中的[菱形运算符](https://en.wikipedia.org/wiki/Diamond_operator)