2012-08-05 71 views
0

我見過設立ARRY列表如下創建一個ArrayList

private ArrayList<Student> students; //instance variable 

public CollegeCommunity()//constructor 

{ 
    students = new ArrayList<Student>(); 
} 

而且如下

ArrayList exampleArray = new ArrayList(); 

我明白爲什麼一個有一個實例變量/構造函數和對方只是簡單地宣佈,但我不確定爲什麼第一個包含<Student>而另一個沒有<...> 兩者之間的區別是什麼?

回答

0

students正在使用所謂的泛型。泛型約束可以傳遞給ArrayList的類型。 exampleArray不指定類型。

3

不同之處在於被稱爲泛型的語言特性,這些特性在Java Tutorials trail here中有解釋。

exampleArray使用泛型類ArrayListraw type宣佈...

一個原始類型是一個泛型類或接口沒有任何類型的參數的名稱。

原始類型具有沒有通用類型的信息,並因此是相同的類中的用途進行了介紹泛型之前。

另一方面,students使用通用parameterized type

A 泛型類型是通過類型參數化的泛型類或接口。

在於Generics are useful它們允許編譯器有更多的類型信息,並且因此通過使其有效地推斷類型,這是在執行強類型消除鑄件用於緩解的編程。

原料ArrayList差不多相當於ArrayList<Object>。差異在有效Java中突出顯示。

原始類型List和參數化類型List<Object>之間的區別是什麼?簡單地說,前者選擇了泛型類型檢查,而後者明確地告訴編譯器它能夠保存任何類型的對象。雖然可以將List<String>傳遞給List類型的參數,但不能將它傳遞給List<Object>類型的參數。泛型有子類型規則,List<String>是原始類型List的子類型,但不是參數化類型List<Object>的子類型。

因此,如果使用像List這樣的原始類型,則會丟失類型安全性,但是如果使用參數化類型(例如List<Object>)則不會。

0

第一個ArrayList聲明具有定義的泛型類型,而exampleArray沒有。建議在可能的情況下使用仿製藥以避免需要鑄造:

E.g.

ArrayList<Student> students = ...; 
Student student = students.get(0); 

與:

ArrayList exampleArray = ...; 
Example example = (Example)exampleArray.get(0); 
0

的原因旁邊有ArrayList<Students>是因爲你需要指定ArrayList將舉行什麼類型的data。在這種情況下,這個人告訴java他想要一個ArrayList包含類的數據類型Students

沒有這樣做,它將無法正常工作。

0

區別僅僅是編譯器的提示。聲明new ArrayList<Student>() 強制實施這樣的事實,即您將在指定的集合中只存儲Student類的實例。這允許Java通過泛型保持strong type-safety

在運行時什麼不會改變,因爲Java有type erasure但這種強烈的約束將幫助您:編譯器將引發錯誤時,你會嘗試用不同的時間使用集合相比,你用聲明的一個它。它被稱爲parametric polymorphism

原始聲明new ArrayList()而不是實例上有對你要存儲在它裏面的物體的類型沒有假設列表:這意味着一切都可以被存儲,但你需要檢索時,他們投退對象。此外,由於在編譯時編譯器將無法檢查將嘗試在集合中插入的內容,因此不會有任何類型安全性。