第一個例子是正確的,你提供所需的一切。但它也意味着您重複參數類型的定義。
然後,在Java 1.7(或者1.8,不太清楚),他們推出的縮短版 - 所以,如果你定義ArrayList<Integer> numbers
,沒有必要定義再講ArrayList
爲Integer
應創建並只需保持<>
那裏。這有時稱爲菱形符號並指示編譯器使用與字段定義相同的數據類型。因此,它的行爲與第一個例子完全相同,但不需要複製有關數據類型的信息。
您創建的ArrayList
沒有指定的數據類型,您在那裏的最後一種情況有所不同。這可能有點危險,因爲它允許你寫下面的代碼:
List listAnything = new ArrayList();
listAnything.add("string");
listAnything.add(42);
listAnything.add(false);
List<Integer> listInteger = listAnything;
以上列舉的代碼編譯完全正常,但大約有選中轉換和使用原始類型一些警告。您不再保證listInteger
僅包含整數。
此外,在這裏警告的話 - 你應該儘可能在你的代碼中依賴抽象。通過這個我的意思是定義你的領域使用一個接口或抽象類而不是具體的。這樣的代碼顯着更好地閱讀和維護:
ArrayList<Integer> list = new ArrayList<>(); // this is not wrong...
List<Integer> list = new ArrayList<>(); // ...but this is better
你的第一個和第二個例子看起來是一樣的嗎? – snozza
我的不好,糾正了我的問題。 – SJ19
關於第三個選項:請參閱[什麼是原始類型,爲什麼我們不應該使用它?](http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-請勿使用-123)請撥打 – Jesper