2015-05-29 73 views
1

嗨,我正在學習卡普蘭selftest問題和答案。我真的堅持一個關於Unchecked轉換警告的解釋。它指出未經檢查的轉換警告vs通用類型的參考

下面的語句將不會產生未檢查轉換警告:

ArrayList list = new ArrayList<>();

但在接下來的一段,它指出

下面的語句將產生選中警告:

ArrayList list = new ArrayList<>(); //generates a conversion warning

我在eclipse檢查它提供了以下警告味精

的ArrayList是一個原始類型。參考通用類型ArrayList應參數化

有人可以幫助我嗎?這只是一個錯字錯誤,或者我錯過了一些東西。 在此先感謝。

編輯 我想我沒有正確解釋我的問題。其實我正在尋找的是「回答這樣一個問題的正確答案是什麼,例如ArrayList list = new ArrayList <>();生成未經檢查的轉換True/False。」因爲在Kaplan selftest中給出了兩個不同的語句,我有點丟失,雖然當我在Eclipse中嘗試代碼時,它不會生成Unchecked轉換警告,但它會引用泛型類型..警告。所以我正在尋找你的建議/建議。再次提前謝謝

+1

除了第二條語句中的尾註釋之外,兩條語句完全相同。所以難怪他們都會產生相同的行爲,在這種情況下,會有警告 –

+0

兩者都會產生相同的行爲,但我對解釋感到困惑。在第一個聲明中,它聲明它不會生成未經檢查的轉換警告,但在接下來的聲明中它聲明它將生成未經檢查的警告。所以我很困惑哪一個應該是正確的答案,儘管Eclipse生成「參考通用...」警告而不是轉換警告。我真的需要理解它來回答考試問題。 –

回答

3

第一:這是一個警告,如果你小心,你可以忽略它,你的代碼仍然會編譯和運行就好。

但是,既然你想擺脫它,你應該在定義它時給你的ArrayList一個類型。

ArrayList<Type> list = new ArrayList<>(); 

該類型可以是任何類,但不是原語。如果你需要一個基元,使用Java提供的包裝類。

+1

在Java 7之前的代碼中,這看起來像這樣:'ArrayList list = new ArrayList ()',如果這可以幫助你更多的OP。 – Oli

+0

我知道如何擺脫那個警告。我試圖理解它來回答考試問題。例如ArrayList list = new ArrayList <>(); 「生成轉換警告」true/false ?.我對ArrayList list = new ArrayList <>();在解釋中聲明它不會產生轉換警告,然後在下一個聲明中說明它會產生轉換警告,因此我有點失落。 –

+0

只是想[添加此答案我發現如此有用](http://stackoverflow.com/a/27720466/1614677) – Manu

0

JDK7:使用金剛石運營商構造類型推斷

ArrayList<Type> list = new ArrayList<>(); 

使用菱形操作符的創建對象時,簡化了使用泛型。它避免了程序中未經檢查的警告,並且通過不需要顯式重複指定參數類型來減少通用冗長。相反,編譯器會推斷該類型。

使用鑽石操作時的類型並不明顯:

類型推斷支持的Java 7和更高版本,僅在參數類型的構造是顯而易見的。例如,如果我們使用菱形操作符不指定如下的識別符的種類,我們會得到一系列的警告:

List arrayList = new ArrayList<>(); 
arrayList.add("First"); 
arrayList.add("Second"); 

編譯與-Xlint程序:未選中,結果如下警告:

... taman\diamond.java:29: warning: [unchecked] unchecked call to add(E) as a member of the 
raw type ArrayList 
arrayList.add("First"); 
where E is a type-variable: 
E extends Object declared in class ArrayList 
... \taman\diamond.java:30: warning: [unchecked] unchecked call to add(E) as a member of the raw type ArrayList arrayList.add("Second"); 
where E is a type-variable: 
E extends Object declared in class ArrayList 
2 warnings 

如果指定的數據類型如下這些警告會消失:

List<String> arrayList = new ArrayList<>(); 
0

你說的是泛型類型。

在Java 1.6,你可以使用構造與仿製藥如下

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

在java中1.7,你可以使用構造與仿製藥如下

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

前面的語句創建擁有一個ArrayList字符串。一種指示ArrayList等數據結構的對象類型的方法。

如果您使用的ArrayList使用舊版本的Java,你會寫這樣的構造:

ArrayList list = new ArrayList(); 

有沒有辦法限制的類型。所以泛型被引入。

儘管您仍然可以這樣做,但泛型使您的代碼更可靠 ,因爲它們爲編譯器提供了一種防止誤用ArrayList的方法。 如果你試圖把一個Integer對象放在一個ArrayList中,它應該保存String對象,編譯器會失敗並報錯。

認爲這將有所幫助。

相關問題