【问题标题】:Java ArrayList declarationsJava ArrayList 声明
【发布时间】:2013-02-15 19:51:47
【问题描述】:

我目前正在准备 Java OCA 考试,遇到了一个与 ArrayList 声明有关的问题。

以下哪项是有效的?:

1. ArrayList al1 = new ArrayList();
2. ArrayList al2 = new ArrayList<>();
3. ArrayList<> al3 = new ArrayList<>();
4. ArrayList<Double> al4 = new ArrayList<>();
5. ArrayList<Double> al5 = new ArrayList<Float>();

根据我的书,答案 1,2 和 4 是有效的。答案 3 和 5 无效。

但是,没有给出适当的解释。它所做的只是展示了声明 ArrayList 的标准方法:

ArrayList<E> al3 = new ArrayList<E>();

并提到在没有泛型部分的情况下声明 ArrayList 也是有效的。

我也无法在网上找到关于此主题的体面文章。有人可以解释(或指出一篇好文章的方向)上面的不同排列吗?

提前致谢。

【问题讨论】:

  • 一些泛型被 SO 格式所吞噬。
  • 谢谢让我很困惑:P
  • 关于 3. &lt;&gt; 被称为 diamond operator 并与 java7 一起引入。它是实例化泛型对象的快捷方式,因此在使用new 时不必再次指定类型,因为它已在变量声明中指定。
  • 这是 Java 7 中的一个特性,ArrayList&lt;Type&gt; l = new ArrayList&lt;&gt;() 只是ArrayList&lt;Type&gt; l = new ArrayList&lt;Type&gt;() 的缩写形式。这是出现空白角的ONLY 有效情况。空白角度在以前的java版本中无效,类型应该是一致的(Double和Float是NOT)。你应该看看旧的语法,它更清楚。

标签: java generics arraylist


【解决方案1】:

1 在所有 Java 版本中都有效

在这里,您在不使用泛型的情况下声明 ArrayList。这意味着无论您向 arraylist 添加什么,当您将其取出时,它的类型都将是 Object 并且需要转换为类型。这是在 Java 1.4(前泛型)中使用集合的旧方式,并且支持向后兼容。现在你应该总是使用泛型。


2 和 4 仅在 Java 7 中有效

空括号: 是 Java7 的新类型推断,这意味着您不必指定类型两次。注意Java7,旧版本无法使用。

所以在 Java7 中

ArrayList<Double> al4 = new ArrayList<>();

是一样的

ArrayList<Double> al4 = new ArrayList<Double>();

此链接包含有关类型推断的更多信息:http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html


3 无效,因为如果您使用泛型,则必须在变量声明中指定类型。


5 是无效的,因为如果你声明一个 Double 类型的 List,你就不能给它分配一个 Float 类型的 List,你只能给它分配一个 Double 类型的列表。

所以这是有效的:

ArrayList<Double> al5 = new ArrayList<Double>();

【讨论】:

  • 感谢您快速明确的回复。我现在有信心在考试中遇到类似的问题。
【解决方案2】:

低于 2 的将是有效的only in Java SE7Java SE7 允许类型推断,因此您无需在 &lt;&gt;again 中提供类型。

  ArrayList<Double> al4 = new ArrayList<>();
  ArrayList al2 = new ArrayList<>();

另一方面,下面的一个在all Java versions上有效;这是为了确保非泛型代码的向后兼容性。

ArrayList al1 = new ArrayList();

以下是不允许的,因为 Float 集合不是 Double 集合的子类型。而且 Float 不是 Double 的子类型;所以毫无疑问它是一个有效的声明。 请注意,即使是数组版本也无法编译。

 Double[] dd = new Float[5];  //won't compile
 ArrayList<Double> al5 = new ArrayList<Float>(); //won't compile

低于 1 的声明无效。

ArrayList<> al3 = new ArrayList<>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 2021-02-21
    • 2012-10-07
    • 2023-03-19
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多