【问题标题】:Set/List Initialization Syntax in JDK 8 [duplicate]JDK 8中的设置/列表初始化语法[重复]
【发布时间】:2015-09-21 09:42:13
【问题描述】:

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

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

到这里

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

将第二个String 标记为冗余。

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

ArrayList<String> someList = new ArrayList();

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

【问题讨论】:

  • 嗯,我想这已经回答了herehere
  • 我明确地寻找 java 8 资源,认为它是 java 8 特定的东西。感谢您提供这些!
  • 你应该在编译时得到一个unchecked conversion警告,表明你正在做一些可能不安全的事情。
  • 其实我没有,这就是最初让我感到惊讶的地方。我正在使用 NetBeans,但我几乎没有注意到该行缺少菱形运算符。
  • 也许您已经调整了 NetBeans 中的警告/检查配置文件?大多数 IDE 将使用其默认设置标记这一点;当然 javac 会在你的构建中发出未经检查的警告。

标签: java list set java-8


【解决方案1】:

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

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

到这里

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

菱形 &lt;&gt; 运算符是在 Java 7 中引入的,因为它易于推断类型并且无需重复类型。

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

ArrayList<String> someList = new ArrayList();

你在这里使用Raw Types,这是不鼓励的。

为了向后兼容,在运行时所有Collections 都被视为包含Object。泛型用于在编译时建立一个合同,它规定每次将某物放入或从该集合中取出某物时,它必须为xxx类型 em>。

任何泛型细节都不会保留在运行时(称为类型擦除),因为泛型是 Java 的仅编译时特性。

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

ArrayList someList = new ArrayList();

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

【讨论】:

  • @joaquin - 不,他/她不是。
  • @joaquin - 我可以向你保证,要么你误解了他所说的话,要么他错了。 没有额外的实例化正在进行。 Java 泛型是仅在编译时的特性,因此不会在运行时产生任何额外开销。
  • @joaquin - 请务必比我在这里说的更有礼貌。 :) 看看here 就这个问题进行有说服力的讨论。
  • @joaquin 向您的教授解释“钻石”表达式只是使用编译时类型推断来选择正确的实例化——然后无论如何都会在运行时被删除。这里绝对没有性能问题。 (现在,也许他喜欢旧方式,因为它更明确,或者只是因为他喜欢旧方式。)
  • @joaquin - 没有比Brian Goetz 更好的权威了。
【解决方案2】:

这些只是编译器警告。

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

在任何情况下编译的代码都是相同的。

基本上这些警告是为了帮助生成“更安全”的代码,即更易于阅读。

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 2015-09-25
    • 2012-09-29
    • 2016-02-26
    • 1970-01-01
    • 2017-01-14
    • 2017-10-07
    • 2022-10-25
    • 1970-01-01
    相关资源
    最近更新 更多