2010-12-11 72 views
3

有人可以解釋這兩個類的ArrayList類的兩個實例之間有什麼不同嗎?實例化通用類時傳遞類型變量

List<Integer> intList = new ArrayList(); 
List<Integer> intList = new ArrayList<Integer>(); 

我知道,編譯器擦除型變量,即Integer,它當編譯成字節碼和上述的例子都工作方式完全相同。我想知道是否有任何好處讓右邊的類型變量(Integer)通過,因爲它已經在左邊聲明瞭?就我能在網上找到的,他們都使用後者,但我看不出有什麼理由爲什麼我應該在兩邊申報兩次。

+1

有鑽石運算符('<>')項目投幣功能,我認爲它在JDK7中,它允許您編寫'列表 ints = new ArrayList <>();'。確定類型的算法與通用方法的工作方式大致相同。 – 2010-12-11 13:52:33

+0

我期待着JDK7中的新功能。這個不錯。 – gigadot 2010-12-11 14:19:40

回答

2

沒有類型參數的版本會產生警告,因爲它可能不是類型安全的。在你的情況下,這不是一個問題,因爲列表是空的,但總的來說是這樣。例如

List<String> stringList = new ArrayList<String>(); 
stringList.add("foo"); 
List<Integer> intList = new ArrayList(stringList); // Warning about unchecked conversion 
int i = intList.get(0); // Oops, throws a ClassCastException 

所以爲了確保類型安全,最好通過在任何地方添加類型參數來擺脫警告。

3

他們是兩回事。左側是您的變量的類型。右側是您正在創建的對象的類型。編譯器將首先使用您在右側給出的類型創建對象,然後將引用分配給左側的變量。

在你的情況下,沒有區別,因爲ArrayList在所有情況下都具有相同的構造函數。但是:

  • 在其他類中,基於您提供的特定類型,構造函數的行爲可能會有所不同。
  • 如果匹配類型,編譯器會更容易。在第一個版本中,編譯器必須將類型爲ArrayList的對象分配給期望類型爲List<Integer>的變量。在某些情況下,您可能會收到警告,因爲類型沒有明顯匹配。
0

你可能想的區別:他們都在運行時相同

List intList = new ArrayList(); 
List<Integer> intList = new ArrayList<Integer>(); 

。但編譯時間有很大差異。