在 Java 7 中,我们可以使用菱形运算符:
List<String> list = new ArrayList<>();
现在我在最近的一些代码中看到人们放弃了钻石运算符:
List<String> list = new ArrayList();
这是在最近的 Java 版本(Java 8+)中添加的新功能以删除菱形运算符吗?或者他们只是依赖于原始的旧 ArrayList 类型(出于向后兼容性的原因恰好可以工作,应该避免)?
在 Java 7 中,我们可以使用菱形运算符:
List<String> list = new ArrayList<>();
现在我在最近的一些代码中看到人们放弃了钻石运算符:
List<String> list = new ArrayList();
这是在最近的 Java 版本(Java 8+)中添加的新功能以删除菱形运算符吗?或者他们只是依赖于原始的旧 ArrayList 类型(出于向后兼容性的原因恰好可以工作,应该避免)?
在我看来,如果可能的话,你不应该忽略它,但它确实有效。
省略它意味着使用原始类型。在运行时,这没有什么区别,因为泛型在编译时被擦除,但您可能会收到编译器警告和/或 linter 警告/错误/失败,因为<Object>
类型不适合。
如果你不知道类型或者不想指定它,你仍然可以使用<? extends Object>
.
问题是如果你想做这样的事情:
List<String>[] data=new List<String>[16];
这不起作用,因为您不能轻松地实例化泛型数组。
在这种情况下,我会忽略类型干扰并忽略(抑制)(可能的)编译器警告。
@SuppressWarnings("unchecked")
List<String>[] data=new List[16];
但是,正如评论中提到的@vbezhenar :
最好避免使用泛型类型的数组,只需使用类似
List<List<String>>
的东西。
通常,List
s 比数组更容易处理,尤其是在使用泛型时。
正确的语法(对于你想要的)是:
List<String> l1=new ArrayList<>();
省略菱形运算符意味着一个不合格的列表,它(当然,在底层是相同的,但是)会给你一个编译器警告。
不合格地使用它会违反编译时类型检查系统,并且不符合您使用菱形运算符声明的变量,但它会编译(如果您做得对,它会工作)。这就是为什么你会收到警告。