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));
不能確定有多少信息是需要這樣的錯誤.. ..
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));
不能確定有多少信息是需要這樣的錯誤.. ..
問題是上面的代碼沒有使用generics。
下面的工作:
Vector<Integer> moves = new Vector<Integer>();
move.add(new Integer(x));
的<>
內的類型名稱(在Vector
的情況下,持有該元素的類型參數E
)告訴它應該期待什麼類型的對象的編譯器。
如果一個嘗試添加一個對象,它是指定類型的,例如在這種情況下,嘗試添加一種String
並Vector<Integer>
,會發生一個編譯時間錯誤,指示對象的類型不是的預期類型正在被添加。
也就是說,應該儘量不要使用Vector
類。出於更多目的,實施List
的課程,如Java Collections Framework的ArrayList
就足夠了,而且表現更好。
編輯
雖然不直接相關的有關仿製藥的問題,亞當·潘德在有關使用自動裝箱的意見提出了一個很好的點。
自Java 5以來,基元及其包裝類(例如, int
和Integer
將根據需要自動相互轉換。
因此,可以添加在等一個Integer
指定爲int
或int
文字到一個類的值:
Vector<Integer> v = new Vector<Integer>();
v.add(5); // Not necessary to use an Integer value.
+1。此外,它似乎正在編譯Java 5或更高版本。正因爲如此,他們還可以利用自動裝箱:'move.add(x);' – 2009-12-03 15:27:44
這是不是一個錯誤,它只是一個編譯器警告。矢量通常parametized,所以要擺脫警告,只是使用泛型:
Vector<Integer> moves = new Vector<Integer>();
moves.add(new Integer(x));
初始化這樣
Vector<Integer> moves = new Vector<Integer>();
您的載體最好使用java.util.ArrayList
- 這是一個替代的Vector
如果您別無選擇,只能使用非通用數據結構,您可以在方法的開始處放置@SuppressWarnings("unchecked")
以使警告消失。
只有當您別無選擇,只能使用非通用向量時纔會這樣做。這通常發生在使用較舊的庫或Java運行時庫的某些部分時。
不直接相關的代碼,但它是recommended使用(從版本> = 5):的
Integer.valueOf(x);
代替
new Integer(x);
因爲,一些整數值{-128, ...,127)是緩存它將始終返回相同的對象。這對於autoboxing尤其有用。
請注意,這不是一個錯誤 - 只是一個警告。如果您不關心警告,那麼執行上述操作仍然非常有效。 – Joel 2009-12-03 15:28:31