Java ArrayList声明

8

我目前正在学习Java OCA考试,并遇到了一个与ArrayList声明相关的问题。

Which of the following is valid?:

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时不带泛型部分也是有效的。

我也无法在网上找到一篇有关此主题的好文章。是否有人能解释一下或指向一篇好文章,介绍上述不同的排列组合方式?

先感谢您的帮助。


2
一些泛型被 SO 格式化吃掉了。 - Vlad
谢谢,让我很困惑 :P - cowls
关于第三点,<> 被称为 diamond operator,并在 Java7 中引入。它是实例化泛型对象的快捷方式,因此当使用 new 时不必再次指定类型,因为它已经在变量声明中指定了。 - A4L
这是Java 7中存在的一个特性,ArrayList<Type> l = new ArrayList<>()只是ArrayList<Type> l = new ArrayList<Type>()的简写形式。这是唯一有效的空角情况。在之前的Java版本中,空角是无效的,类型应该是一致的(Double和Float是不一致的)。你应该看一下旧语法,那更加清晰明了。 - shuangwhywhy
2个回答

14

1 在所有版本的Java中都是有效的。

在这里,您声明了ArrayList而没有使用泛型。这意味着无论您向数组列表中添加什么,当您将其取出时,它将是Object类型,并且需要转换为类型。这是在Java 1.4中使用集合的旧方法(没有泛型),并且受到向后兼容的支持。现在,您应始终使用泛型。


只有在Java 7中,2和4是有效的。

空括号:<> 是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的List。

因此,以下内容是有效的:

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

感谢您快速而清晰的回复。现在我有信心如果考试中出现类似的问题,我可以应对它。 - Ambiorix

2

以下 2 个示例仅适用于 Java SE7。在 Java SE7 中,允许类型推断,因此您无需再次在 <> 内提供类型。

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

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

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<>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接