2009-12-03 31 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

答えて

28

上記のコードはgenericsを使用していないという問題があります。

次のように動作します:

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

move.add(new Integer(x)); 

タイプ名を<>内(Vectorの場合は、型パラメータE保持する要素については)それは期待すべきオブジェクトの種類をコンパイラーに指示します。

StringVector<Integer>を追加しようとすると、指定したタイプのオブジェクトを追加しようとすると、コンパイル時エラーが発生し、予想されるタイプの追加が追加されています。

つまり、Vectorクラスを使用しないようにしてください。より多くの目的のために、Java Collections FrameworkののようなListを実装するクラスで十分であり、より良い実行である。

編集

直接ジェネリック医薬品についての質問に関連していないものの、アダム・ペインターは、オートボクシングの使用についてのコメントで良い点を育てました。

Java 5以降、プリミティブとそのラッパークラス、 intIntegerは必要に応じて自動的に相互に変換されます。

エラーはありません
Vector<Integer> v = new Vector<Integer>(); 
v.add(5); // Not necessary to use an Integer value. 
+1

+1。また、Java 5以上でコンパイルされているようです。このため、彼らはオートボクシングを利用することもできます: 'move.add(x);' –

4

、それだけでコンパイラの警告です:

したがって、期待しintまたはクラスにリテラルintとして指定された値Integerを追加することが可能です。ベクターは、通常はジェネリックを使用するので、警告を取り除くために、parametizedさ:

Vector<Integer> moves = new Vector<Integer>(); 
moves.add(new Integer(x)); 
1
  1. 好ましくjava.util.ArrayListを使用して、この

    Vector<Integer> moves = new Vector<Integer>(); 
    
  2. のようなあなたのベクトルを初期化する - それはVector

    の交換です
3

非汎用データ構造を使用する以外に選択肢がない場合はメソッドの先頭に@SuppressWarnings("unchecked")を置き、警告を消音することができます。

これは、非汎用ベクトルを使用する以外に選択肢がない場合にのみ実行されます。これは通常、古いライブラリやJavaランタイムライブラリの特定の部分で作業しているときに発生します。

0

直接コードに関連し、それは(バージョン> = 5から)を使用するrecommendedではない:

Integer.valueOf(x); 

代わりに

new Integer(x); 

何らかの整数値{-128、ため...、127)はにキャッシュされ、にキャッシュされ、常に同じオブジェクトが返されます。特にautoboxingに関しては非常に便利です。

関連する問題