在最近的 java 版本 (8+) 中可以省略菱形运算符吗?

Is it ok to omit diamond operator in recent java versions (8+)?

使用 Java 7 我们可以使用菱形运算符:

List<String> list = new ArrayList<>();

现在我在最近的一些代码中看到人们放弃了菱形运算符:

List<String> list = new ArrayList();

这是最近 java 版本(Java 8+)中添加的一项新功能,用于删除钻石运算符吗?或者他们只是依赖原始的旧 ArrayList 类型(出于向后兼容性的原因,它恰好可以工作,应该避免)?

在我看来,如果可能的话,你不应该省略它,但它确实有效。

省略表示使用原始类型。在运行时,这没有区别,因为泛型在编译时被擦除,但您可能会收到编译器警告 and/or linter warnings/errors/fails 因为 <Object> 类型不适合。

如果你不知道类型或者不想指定它,你仍然可以使用<? extends Object>

问题是如果你想做这样的事情:

List<String>[] data=new List<String>[16];

这不起作用,因为您无法轻松实例化泛型数组。

在那种情况下,我会忽略类型干扰并忽略(抑制)(可能的)编译器警告。

@SuppressWarnings("unchecked")
List<String>[] data=new List[16];

但是,正如评论中提到的@vbezhenar

It's better to avoid using arrays of generic types, just use something like List<List<String>> for that.

一般来说,List比数组更容易处理,尤其是当你使用泛型时。

正确的语法(如您所愿)是:

List<String> l1=new ArrayList<>();

省略菱形运算符意味着不合格列表,这(当然,在引擎盖下是相同的,但是)会给您一个编译器警告。

不合格地使用它会违反编译时类型检查系统,并且与您使用菱形运算符声明的变量不一致,但它会编译(如果操作正确则可以工作)。这就是为什么你会收到警告。