コードの問題のあるビット
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
を実装するクラスで十分です、そしてより良いパフォーマンス。
編集
ジェネリックスに関する質問とは直接関係はありませんが、Adam Paynterはオートボクシングの使用に関するコメントで良い点を挙げました。
Java 5なので、プリミティブとそのラッパークラス、たとえばint
とInteger
は、必要に応じて相互に自動的に変換されます。
したがって、int
を期待するクラスに、int
またはInteger
リテラルとして指定された値を追加することができます。
Vector<Integer> v = new Vector<Integer>();
v.add(5); // Not necessary to use an Integer value.
これはエラーではなく、単なるコンパイラの警告です。通常、ベクターはパラメーター化されているため、警告を回避するには、ジェネリックを使用します。
Vector<Integer> moves = new Vector<Integer>();
moves.add(new Integer(x));
非ジェネリックデータ構造を使用する以外に方法がない場合は、@SuppressWarnings("unchecked")
をメソッドの先頭に置いて警告を止めることができます。
これは、非ジェネリックベクトルを使用する以外に方法がない場合にのみ行います。これは通常、古いライブラリまたはJavaランタイムライブラリの特定の部分を操作しているときに発生します。
このようにあなたのベクトルを初期化する
Vector<Integer> moves = new Vector<Integer>();
できればJava.util.ArrayList
-Vector
の代わりです
コードに直接関係はありませんが、使用するのは 推奨 です(バージョン> = 5以降):
Integer.valueOf(x);
の代わりに
new Integer(x);
なぜなら、いくつかの整数値{-128、...、127)はcachedであり、常に同じオブジェクトを返すからです。これは、特に autoboxing に関して非常に役立ちます。