Generic Array Creationのエラーがわかりません。
最初に次のことを試しました。
public PCB[] getAll() {
PCB[] res = new PCB[list.size()];
for (int i = 0; i < res.length; i++) {
res[i] = list.get(i);
}
list.clear();
return res;
}
その後、私はこれをやってみました:
PCB[] res = new PCB[100];
正しいと思われる原因を見逃しているに違いありません。実際に調べてみました。そして、何もクリックしていません。
私の質問は次のとおりです。これを修正するにはどうすればよいですか?
エラー:
.\Queue.Java:26: generic array creation
PCB[] res = new PCB[200];
^
Note: U:\Senior Year\CS451- file
uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
ツールは終了コード1で完了しました
汎用コンポーネントタイプの配列を作成することはできません。
代わりに、_Object[]
_などの明示的な型の配列を作成します。その後、必要に応じてこれを_PCB[]
_にキャストできますが、ほとんどの場合はお勧めしません。
_PCB[] res = (PCB[]) new Object[list.size()]; /* Not type-safe. */
_
型の安全性が必要な場合は、配列の代わりに_Java.util.List<PCB>
_などのコレクションを使用します。
ところで、list
が既に_Java.util.List
_である場合、コード内でそれらを複製するのではなく、toArray()
メソッドのいずれかを使用する必要があります。しかし、これは型安全性の問題を回避するものではありません。
以下は、型の安全性を維持しながら、必要な型の配列を提供します。
PCB[] getAll(Class<PCB[]> arrayType) {
PCB[] res = arrayType.cast(Java.lang.reflect.Array.newInstance(arrayType.getComponentType(), list.size()));
for (int i = 0; i < res.length; i++) {
res[i] = list.get(i);
}
list.clear();
return res;
}
これがどのように機能するかは、Kirk Wollが重複としてリンクした質問に対する my answer で詳しく説明されています。
「重複の可能性」で提案されている方法に加えて、この問題を回避する他の主な方法は、配列自体(または少なくとも1つのテンプレート)が呼び出し側によって提供されることです。したがって、アレイを安全に作成します。
これは、ArrayList.toArray(T[])
などのメソッドが実装される方法です。インスピレーションを得るためにその方法をご覧になることをお勧めします。さらに良いことに、他の人が指摘したように、おそらくとにかくその方法を使用する必要があります。