Java ArrayList声明

Amb*_*rix 8 java generics arraylist

我目前正在攻读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>();
Run Code Online (Sandbox Code Playgroud)

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

但是,没有给出适当的解释.它所做的就是显示声明ArrayList的标准方法:

ArrayList<E> al3 = new ArrayList<E>();
Run Code Online (Sandbox Code Playgroud)

并且提到声明没有通用部分的ArrayList也是有效的.

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

提前致谢.

cow*_*wls 14

1在所有Java版本中都有效

在这里,您在不使用泛型的情况下声明ArrayList.这意味着无论你添加到arraylist中的是什么,当你将它取回时它将是类型Object并且需要转换为类型.这是在Java 1.4(pre generics)中使用Collections的旧方法,并且支持向后兼容性.现在你应该总是使用泛型.


2和4仅在Java 7中有效

空括号:<>是Java7的新类型推断,这意味着您不必两次指定类型.注意Java7,它不适用于旧版本.

所以在Java7中

ArrayList<Double> al4 = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

是相同的

ArrayList<Double> al4 = new ArrayList<Double>();
Run Code Online (Sandbox Code Playgroud)

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


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


5是无效的,因为如果您声明一个类型为Double的List,则无法为其指定一个类型为Float的List,您只能为其指定一个Double类型的列表.

所以这是有效的:

ArrayList<Double> al5 = new ArrayList<Double>();
Run Code Online (Sandbox Code Playgroud)