在Java 7之前,使用generics我们必须为变量类型及其实际类型提供类型参数。 现在,此新的Java 7功能已使它有所缓解。 声明右侧的空白Java diamond operator可以正常工作。
菱形算符用两个角度'< >' 。
1. Before generics – raw type declarations
如果您使用的是Java的早期版本(1.5之前的版本),则当泛型不是Java功能时,开发人员必须使用原始类型声明和初始化。 例如,下面给出的是一个HashMap声明。Map params = new HashMap();
这种方法的问题是,您可以将任何对象类型都放入键和值中,并且只有在运行时,如果对象不是所需类型,才会出现错误。 没有编译时安全可以警告开发人员,哪些类型是允许的,哪些类型是不允许的。
2. Generics – parameterized types
JDK 1.5带来了泛型。 它必须具有许多急需的功能,并且完全改变了开发人员编写代码的方式。 它启用了编译时安全性。 它有助于大量减少运行时错误。Map params = new HashMap();
该语法解决了编译时类型安全的问题。 实际上,以上语法几乎适用于所有用例。 在上面的示例中,如果尝试添加任何其他类型的键或值,则编译器将给您错误。
您需要修复代码才能通过编译器。
3. Diamond operator
参数化类型可以解决问题,但由于双方重复的类型信息相同,因此看起来很繁琐。 如果我们可以在一侧提供类型信息,而另一侧可以检测和应用类型信息,则可以减少语法。
Java中的Diamond运算符执行完全相同的操作 。 它也被称为Elvis operator 。 在下面查看diamond operator syntax 。Map params = new HashMap<>();
在上面的代码中,编译器足够聪明,可以识别diamond operator推断出声明左侧的类型。 它将类型信息也应用于右侧对象。 它有助于向Java添加类型推断功能。
4. Backward compatibility
为了向后兼容,原始类型和参数化类型仍然存在。 但是新的编译器会在看到原始类型时发出警告。 如果从Java 5开始编译原始类型,您将得到如下警告:ArrayList is a raw type. References to generic type ArrayList should be parameterized
Happy Leaning !!
Read More: