2016-05-13 139 views
0

之間的區別兩個聲明之間有什麼區別?新ArrayList <String>()和新ArrayList()

new ArrayList<String>(); 
new ArrayList(); 

他們工作,但第二個返回警告。我不明白爲什麼。

我知道ArrayList<String> arrArrayList arr之間的區別,第一個啓用了類型檢查控制。但是new ArrayList<String>()new ArrayList()呢?在實施層面有什麼不同嗎?在控制方面我會失去什麼?

+9

它檢測到類型,如果你使用''''鑽石操作符,像'列表 strings = new ArrayList <>();' – GhostCat

回答

1

在Java 7能夠自動檢測類型,但你需要使用Diamond Operator

ArrayList<String> arr = new ArrayList<>(); 

它基本上是在第一線的語法糖。沒有鑽石操作員,這是一個原始類型(非參數化的泛型)。原始類型的存在是爲了與不支持泛型的舊Java版本兼容,但會在使用時引發警告。

+2

即使這是真的,它不回答問題:「什麼ArrayList arr = new ArrayList ()'和'ArrayList arr = new ArrayList();'?「.. –

+0

@kapep我知道了,但我還是不明白我輸了什麼,編譯器檢查條款,編碼'ArrayList arr = new ArrayList();'。我的意思是,如果我以這種方式編寫'arr.add(arr.get(0))''dosn't不返回錯誤。 – zer0uno

0

您需要知道,在運行時,所有泛型都將被擦除,因此無論您將什麼放入您的<>中,所有ArrayLists的類型都是相同的。

因此,儘管第二行是可能的(由於歷史原因,在泛型可能之前),但應該避免它,因爲它會混淆這些類型。

1

如前所述,這可以使用<>鑽石算子來解決。

但是有理由這樣。您必須記住,在收集類別後添加的仿製藥。這個想法是他們的泛型不應該破壞現有的源代碼。 Sun不希望客戶在編譯噸位和現有代碼時使用未生成列表突然失敗...

因此,java編譯器必須接受類似... = new ArrayList()的代碼。 但重點是,這種聲明創建了一個所謂的「原始類型」。

如果可能的話,你永遠不應該使用原始類型。這就是爲什麼日食和javac給你警告 - 提醒你永遠不要創建原始類型。