2009-12-03 75 views
21

犯規位Java的警告:未經檢查的通話添加的代碼(E)

Vector moves = new Vector(); 

moves.add(new Integer(x)); 

錯誤:

ConnectFour.java:82: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.Vector moves.add(new Integer(x)); 

不能確定有多少信息是需要這樣的錯誤.. ..

+6

請注意,這不是一個錯誤 - 只是一個警告。如果您不關心警告,那麼執行上述操作仍然非常有效。 – Joel 2009-12-03 15:28:31

回答

28

問題是上面的代碼沒有使用generics

下面的工作:

Vector<Integer> moves = new Vector<Integer>(); 

move.add(new Integer(x)); 

<>內的類型名稱(在Vector的情況下,持有該元素的類型參數E)告訴它應該期待什麼類型的對象的編譯器。

如果一個嘗試添加一個對象,它是指定類型的,例如在這種情況下,嘗試添加一種StringVector<Integer>,會發生一個編譯時間錯誤,指示對象的類型不是的預期類型正在被添加。

也就是說,應該儘量不要使用Vector類。出於更多目的,實施List的課程,如Java Collections FrameworkArrayList就足夠了,而且表現更好。

編輯

雖然不直接相關的有關仿製藥的問題,亞當·潘德在有關使用自動裝箱的意見提出了一個很好的點。

自Java 5以來,基元及其包裝類(例如, intInteger將根據需要自動相互轉換。

因此,可以添加在等一個Integer指定爲intint文字到一個類的值:

Vector<Integer> v = new Vector<Integer>(); 
v.add(5); // Not necessary to use an Integer value. 
+1

+1。此外,它似乎正在編譯Java 5或更高版本。正因爲如此,他們還可以利用自動裝箱:'move.add(x);' – 2009-12-03 15:27:44

4

這是不是一個錯誤,它只是一個編譯器警告。矢量通常parametized,所以要擺脫警告,只是使用泛型:

Vector<Integer> moves = new Vector<Integer>(); 
moves.add(new Integer(x)); 
1
  1. 初始化這樣

    Vector<Integer> moves = new Vector<Integer>(); 
    
  2. 您的載體最好使用java.util.ArrayList - 這是一個替代的Vector

3

如果您別無選擇,只能使用非通用數據結構,您可以在方法的開始處放置@SuppressWarnings("unchecked")以使警告消失。

只有當您別無選擇,只能使用非通用向量時纔會這樣做。這通常發生在使用較舊的庫或Java運行時庫的某些部分時。

0

不直接相關的代碼,但它是recommended使用(從版本> = 5):的

Integer.valueOf(x); 

代替

new Integer(x); 

因爲,一些整數值{-128, ...,127)是緩存它將始終返回相同的對象。這對於autoboxing尤其有用。

相關問題