Set/List JDK 8 中的初始化语法

Set/List Initialization Syntax in JDK 8

在JDK8中,编译器建议省略这个

ArrayList<String> someList = new ArrayList<String>();

对此

ArrayList<String> someList = new ArrayList<>();

将第二个 String 标记为冗余。

但是,即使像这样完全省略菱形运算符,编译器也不会报错

ArrayList<String> someList = new ArrayList();

这似乎不会在运行时产生任何问题。有钻石运营商和没有钻石运营商之间有什么具体区别吗?如果有人能详细说明,我将不胜感激。

In JDK 8, compiler suggests to omit this

ArrayList<String> someList = new ArrayList<String>();

To this

ArrayList<String> someList = new ArrayList<>();

钻石 <> 运算符是在 Java 7 中引入的,因为它很容易推断类型并且无需重复类型。

However, compiler does not complain even if the diamond operator is completely omitted like this

ArrayList<String> someList = new ArrayList();

此处您使用的是 Raw Types,这是不鼓励的。

为了向后兼容,在 运行 时所有 Collection 都被视为包含 Object。泛型用于在编译时 建立契约,它说 每次将某物放入或取出该集合时,它 必须 类型为 xxx.

None 的泛型细节保留在 运行 时间(称为类型擦除),因为泛型是 [=41= 的 仅编译时 特性].

因此,此代码实际上是完全可以接受的(尽管不鼓励)。但是,如果您达到:

ArrayList someList = new ArrayList();

你会开始发现非常奇怪和意想不到的事情。

这些只是编译器警告。

建议删除类型以使用菱形运算符的警告似乎已打开。关于缺少 type/diamond 运算符的警告未打开。

无论如何,编译后的代码是相同的。

本质上,这些警告是为了帮助生成 'safer' 代码,即更易于阅读。