【问题标题】:Is it ok to omit diamond operator in recent java versions (8+)?在最近的 Java 版本(8+)中可以省略菱形运算符吗?
【发布时间】:2020-07-16 03:47:58
【问题描述】:

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

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

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

List<String> list = new ArrayList();

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

【问题讨论】:

  • 它仍然是原始类型,您仍然不应该使用它。
  • 没有菱形运算符(或任何类型的泛型)过去、现在和将来都是有效的 Java。它只是意味着使用原始类型。这是从泛型在 Java 中不存在的时候(在 Java 5 之前)开始的。你不应该使用原始类型,没有理由使用它们。始终指定您要使用的泛型类型(或使用菱形运算符从上下文自动推断它)。

标签: java generics diamond-operator


【解决方案1】:

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

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

如果不知道类型或者不想指定,仍然可以使用&lt;? extends Object&gt;

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

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

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

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

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

但是,正如 cmets 中提到的@vbezhenar

最好避免使用泛型类型的数组,只需使用 List&lt;List&lt;String&gt;&gt; 之类的东西。

一般来说,Lists 比数组更容易处理,尤其是在您使用泛型的情况下。

【讨论】:

  • 最好避免使用泛型类型的数组,只需使用List&lt;List&lt;String&gt;&gt; 之类的东西。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 2011-05-09
    • 2023-03-20
    • 2013-04-27
    • 1970-01-01
    • 2010-10-05
    • 2014-09-28
    相关资源
    最近更新 更多