web-dev-qa-db-ja.com

エラー:汎用配列作成

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で完了しました

33
Luron

汎用コンポーネントタイプの配列を作成することはできません。

代わりに、_Object[]_などの明示的な型の配列を作成します。その後、必要に応じてこれを_PCB[]_にキャストできますが、ほとんどの場合はお勧めしません。

_PCB[] res = (PCB[]) new Object[list.size()]; /* Not type-safe. */
_

型の安全性が必要な場合は、配列の代わりに_Java.util.List<PCB>_などのコレクションを使用します。

ところで、listが既に_Java.util.List_である場合、コード内でそれらを複製するのではなく、toArray()メソッドのいずれかを使用する必要があります。しかし、これは型安全性の問題を回避するものではありません。

40
erickson

以下は、型の安全性を維持しながら、必要な型の配列を提供します。

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 で詳しく説明されています。

4
gdejohn

「重複の可能性」で提案されている方法に加えて、この問題を回避する他の主な方法は、配列自体(または少なくとも1つのテンプレート)が呼び出し側によって提供されることです。したがって、アレイを安全に作成します。

これは、ArrayList.toArray(T[])などのメソッドが実装される方法です。インスピレーションを得るためにその方法をご覧になることをお勧めします。さらに良いことに、他の人が指摘したように、おそらくとにかくその方法を使用する必要があります。

4
Mark Peters