2014-04-05 145 views

回答

11

真的沒有區別,但第二個會給你一個編譯警告。

它們編譯爲相同的字節碼,因爲編譯器會拋棄有關您使用的類型參數的信息。

問題是ArrayList類是在泛型之前發明的,所以我們以前總是不得不將它創建爲new ArrayList(),而沒有指定類型參數。現在使用泛型,我們可以指定將存儲在ArrayList中的對象類型,並讓編譯器檢查我們是否正確使用它。這樣做的符號就是你在第一個例子中使用的符號。

但是,編譯器隨後執行的任何檢查都基於變量的類型,而不是您創建的類的類型,因此,在最初的編譯器警告之後,差異根本不起作用。

從Java 7開始,編寫此文件的首選方式是List<String> stringList = new ArrayList<>();,但是此早期版本的Java中不提供此標記。

+0

什麼時候我們要停止提到泛型之前的時間? –

+0

@SotiriosDelimanolis當Oracle嘗試產生一個體面的日期/時間API時,最終會提供一些僅代表2004年以後的日期,當然。 –

+0

是的,我出生於2004年。我不認爲世界在此之前就存在:) –

4

這兩個名稱都不好:變量的名稱應該反映它的內容。我已經知道這是一個變量,我已經知道這是一個列表。

什麼是在列表中?例如:如果是小狗的包包我剛買的寵物商店:

List<Puppy> puppies = new ArrayList<>() 

注意我是如何省略型:這是可能的,因爲Java 7的,是完全一樣

List<Puppy> puppies = new ArrayList<Puppy>() 
+0

我省略了第一部分,沒有看到兩個都被聲明爲'List '。我會留下關於命名的評論,David已經討論了這個實例。 –

0

它們混合通用和非通用類型。考慮這一點,

List<Double> t = new ArrayList(); 
List<String> stringList = new ArrayList(t); 

顯然,可以在運行時炸燬。 Type erasure確實是一個性能提升,但它意味着泛型只是一個編譯時檢查,

// This is a compile error. 
List<Double> t = new ArrayList<Double>(); 
List<String> stringList = new ArrayList<String>(t); 

最後,在Java 7+可以使用diamond operator -

// This is a compile error. 
List<Double> t = new ArrayList<>(); 
List<String> stringList = new ArrayList<>(t); 
相關問題