【问题标题】:Use of <> in Java generics [duplicate]在 Java 泛型中使用 <> [重复]
【发布时间】:2021-08-20 11:38:16
【问题描述】:

为什么Java接受下面的代码行,而只出现在右边? 标志没有这样的(泛型功能)用途?

List balloons = new ArrayList<>();

到目前为止,我只了解右侧 的用法,如下例所示。 这里Java推断左边的类型,右边不用再指定,直接用即可。

    List<String> balloons = new ArrayList<>();
    balloons.add("blue");
    balloons.add("yellow");
    // balloons.add(1); // will not compile as balloons is type safe, demanding String input
    System.out.println(balloons.get(0));
    System.out.println(balloons.get(1));
    // System.out.println(balloons.get(2));

【问题讨论】:

  • 这能回答你的问题吗? Diamond operator in raw type context
  • 作为一般说明,以防不清楚:永远不要在泛型类型上遗漏&lt;...&gt;,只需编写List balloons 即可为您提供原始类型。这基本上是 Java 5 之前的一种后备模式,甚至比 List&lt;Object&gt; 更糟糕,你失去了所有类型安全。

标签: java generics diamond-operator


【解决方案1】:

列表定义为

List balloons = new ArrayList<>();

raw type,这意味着您可以在此列表中存储任何内容。

这个

List balloons = new ArrayList<>();

类似于

List<Object> balloons = new ArrayList<>();

注意:重要的是要注意ListList&lt;Object&gt; 相似但它们之间存在差异。见:Java difference between List and List<Object>

【讨论】:

  • 请注意,ListList&lt;Object&gt; 相似但不同。他们的行为不同。例如,您可以使用变量上的原始类型执行balloons = dogs;。 RIP 类型安全。
  • @Zabuzard 感谢您指出这一点。在问题中添加了一个链接,解释了这两种类型之间的区别。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多