2013-03-01 127 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<>();