1

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

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

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

List<String> list = new ArrayList();

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

4

2 回答 2

2

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

省略它意味着使用原始类型。在运行时,这没有什么区别,因为泛型在编译时被擦除,但您可能会收到编译器警告和/或 linter 警告/错误/失败,因为<Object>类型不适合。

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

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

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

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

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

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

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

最好避免使用泛型类型的数组,只需使用类似List<List<String>>的东西。

通常,Lists 比数组更容易处理,尤其是在使用泛型时。

于 2020-04-03T21:54:48.123 回答
1

正确的语法(对于你想要的)是:

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

省略菱形运算符意味着一个不合格的列表,它(当然,在底层是相同的,但是)会给你一个编译器警告。

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

于 2020-04-03T22:21:28.373 回答