2013-03-01 81 views
8

我目前正在学习Java OCA考试,并且遇到了有关ArrayList声明的问题。Java 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没有通用部分。

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

在此先感谢。

+2

一些仿制药正在被SO格式化。 – Vlad 2013-03-01 10:37:43

+0

感谢我让我感到非常困惑:P – cowls 2013-03-01 10:40:26

+0

关于3,'<>'被称为'钻石运算符'并且被引入'java7'。它是安装通用对象的捷径,所以在使用'new'时不必再次指定类型,因为它已经在变量声明中指定。 – A4L 2013-03-01 10:41:48

回答

14

1是有效的Java中

的所有版本

这里您声明ArrayList中不使用泛型。这意味着无论你将什么添加到数组列表中,当你将其取出时,它将是Object类型,并且需要将其转换为类型。这是在Java 1.4(预泛型)中使用Collections的旧方法,并且支持向后兼容性。现在你应该总是使用泛型。


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是无效的,因为如果你声明与类型列表中双击你不能再为它分配一个列表是float类型的,你只能为它分配一个double类型的列表。

因此,这将是有效的:

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

感谢您的快速和明确的答复。我现在很有信心,如果它出现在考试中,我可以处理类似的问题。 – user2123069 2013-03-01 10:50:44

+0

没问题,祝你好运 – cowls 2013-03-01 10:56:07

2

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

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

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

ArrayList al1 = new ArrayList(); 

下面是不允许作为浮动的收藏是不是双重的集合的子类型。而且Float不是Double的子类;所以毫无疑问它是一个有效的声明。 请注意,即使是阵列版本也不会编译。

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

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

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