2012-02-29 13 views
2

我希望我的問題不會聽起來很蠢,但我想知道什麼是這兩條線之間的區別:的Java:ArrayList的初始化(2碼線之間的差值)

(假設我犯了一個名爲類牛..)

ArrayList<Cow> c1 = new ArrayList<Cow>(); 

ArrayList<Cow> c2 = new ArrayList(); 

在此先感謝您的解釋。

+0

嘗試使用javac -Xlint選項編譯代碼並查看編譯器對此有何評論。 – Andy 2012-02-29 15:10:54

+0

您將獲得日食這些惱人的警告(例如)如果你使用第二個選項:) – Jerome 2012-02-29 15:12:36

+0

葉發生什麼事了,甚至通過使用javac沒有第二屬性你剛剛給它指出的東西,以及反正我不那麼在意技術細節我只是想知道,如果列表本身在某種程度上是不同的... – Popokoko 2012-02-29 15:15:04

回答

7

目前,基本上沒有區別,由於type erasure。第一種形式是優選的;第二種形式使用了原始類型,並且僅支持與舊版本的Java向後兼容性。一個好的編譯器會給你警告,如果你使用它。

作爲the Java Language Specification, Third Edition, §4.8說明:

使用原始類型被允許僅作爲讓步的遺留代碼兼容。強烈建議在將通用性引入到Java編程語言後編寫的代碼中使用原始類型。 未來版本的Java編程語言可能會禁止使用原始類型。

(強調原文)。

+0

HM得到它!所以你說這個列表本身基本上是一樣的,很好的解釋隊友:) – Popokoko 2012-02-29 15:16:41

1

作爲ruakh剛纔指出,第一種是優選的,並且實際上不會有任何差別duriong執行。

解釋在簡單的話: 在兩條線您聲明 列表中你列表初始化它的第一行。 在你使用對象列表初始化它第二個(和對象的子類)。

將它更好地聲明爲列表界面列表

List<Cow> listOfCows = new ArrayList<Cow>();