8

我目前正在学习 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 也是有效的。

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

提前致谢。

4

2 回答 2

14

1 适用于所有 Java 版本

在这里,您在不使用泛型的情况下声明 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>();
于 2013-03-01T10:36:16.220 回答
2

低于 2 将是有效only in Java SE7的。Java SE7允许类型推断,因此您无需<>再次在内部提供类型。

  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

以下一个不是有效的声明。

ArrayList<> al3 = new ArrayList<>();
于 2013-03-01T10:46:46.360 回答