web-dev-qa-db-ja.com

Javaベクターを使用した警告:add(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));

このようなエラーに必要な情報の量は本当にわかりません...

27
kylex

問題は、上のコードが generics を使用していないことです。

以下が機能します:

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

move.add(new Integer(x));

<>内の型名(Vectorの場合、要素が保持する型パラメーターE)は、コンパイラーが予期するオブジェクトの型を示します。

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

つまり、 Vector クラスを使用しないようにする必要があります。より多くの目的のために、 ListJava Collections Framework のような ArrayList を実装するクラスで十分です、そしてより良いパフォーマンス。

編集

ジェネリックスに関する質問とは直接関係はありませんが、Adam Paynterはオートボクシングの使用に関するコメントで良い点を挙げました。

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

したがって、intを期待するクラスに、intまたはIntegerリテラルとして指定された値を追加することができます。

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

これはエラーではなく、単なるコンパイラの警告です。通常、ベクターはパラメーター化されているため、警告を回避するには、ジェネリックを使用します。

Vector<Integer> moves = new Vector<Integer>();
moves.add(new Integer(x));
6
Andreas_D

非ジェネリックデータ構造を使用する以外に方法がない場合は、@SuppressWarnings("unchecked")をメソッドの先頭に置いて警告を止めることができます。

これは、非ジェネリックベクトルを使用する以外に方法がない場合にのみ行います。これは通常、古いライブラリまたはJavaランタイムライブラリの特定の部分を操作しているときに発生します。

3
James Schek
  1. このようにあなたのベクトルを初期化する

    Vector<Integer> moves = new Vector<Integer>();
    
  2. できればJava.util.ArrayList-Vectorの代わりです

1
Bozho

コードに直接関係はありませんが、使用するのは 推奨 です(バージョン> = 5以降):

Integer.valueOf(x);

の代わりに

new Integer(x);

なぜなら、いくつかの整数値{-128、...、127)はcachedであり、常に同じオブジェクトを返すからです。これは、特に autoboxing に関して非常に役立ちます。

0
fikovnik