🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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)