在最近的 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<>();
省略菱形运算符意味着不合格列表,这(当然,在引擎盖下是相同的,但是)会给您一个编译器警告。
不合格地使用它会违反编译时类型检查系统,并且与您使用菱形运算符声明的变量不一致,但它会编译(如果操作正确则可以工作)。这就是为什么你会收到警告。
使用 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<>();
省略菱形运算符意味着不合格列表,这(当然,在引擎盖下是相同的,但是)会给您一个编译器警告。
不合格地使用它会违反编译时类型检查系统,并且与您使用菱形运算符声明的变量不一致,但它会编译(如果操作正确则可以工作)。这就是为什么你会收到警告。