【问题标题】:Java type specification in ArrayList instance [duplicate]ArrayList 实例中的 Java 类型规范
【发布时间】:2015-12-18 17:29:25
【问题描述】:

在 Eclipse IDE 中使用 JDK 1.8 时,以下行没有原始类型警告:

1) ArrayList<Double> d1 = new ArrayList<>();

但是有一个编译器警告:

2) ArrayList<Double> d2 = new ArrayList();

在语法上,唯一的区别是尖括号“”。但在这两种情况下都没有实际指定类型。如果尖括号留空,是否推断出Double类型?

【问题讨论】:

  • 可以,只要编译器能从上下文中推断出来,就可以省略类型参数。
  • 仅供参考,java中<>之类的空尖括号称为菱形运算符
  • 回答显而易见的问题; “为什么会这样?”因为原始类型是支持向后兼容性的必要因素

标签: java eclipse generics arraylist


【解决方案1】:

一句话——是的。

空尖括号 (<>) 允许编译器推断泛型类型。正如the documentation 所说:

只要编译器可以从上下文推断类型参数,您就可以用一组空类型参数 () 替换调用泛型类的构造函数所需的类型参数。这对尖括号被非正式地称为菱形。

再次引用文档,这与使用原始类型完全不同:

请注意,要在泛型类实例化期间利用类型推断,您必须使用菱形。

【讨论】:

    【解决方案2】:
        new ArrayList()
    

    这会创建一个原始类型。原始类型可以分配给泛型 ArrayList<Whatever> 并带有 unchecked 警告,因为它对于类型系统确实不安全。

        new ArrayList<>()
    

    这会创建一个泛型类型;类型参数是从上下文中推断出来的。

    【讨论】:

      猜你喜欢
      • 2014-04-26
      • 2020-12-19
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2018-01-09
      • 2013-03-19
      相关资源
      最近更新 更多