ジェネリック配列と型消去の謎
ジェネリックを扱うとき、なぜ一部の配列宣言が許可され、他の宣言が許可されないのか混乱することがあります。って。次の点を考慮してください:
ArrayList<Key> a = new ArrayList<Key>(); // Compiles fine
このコードは問題なくコンパイルされます。ただし、汎用リストの配列:
ArrayList<Key>[] a = new ArrayList<Key>[10]; // Compiler error
の場合、コンパイラはエラーを出します。なぜそうなるのですか?
型消去の役割
この問題は、Java の型消去の概念に起因しています。ジェネリック型がコンパイルされると、その型パラメーターは削除され、生の型に置き換えられます。これは、実行時にすべてのジェネリック型が対応する生の型として扱われることを意味します。
最初の例では、ArrayList
ただし、配列の場合は話が異なります。配列の各要素は同じ型でなければなりません。したがって、ArrayList
問題の修正
この問題を解決するには、配列を明示的な raw 型にキャストできます。
ArrayList<Key>[] a = (ArrayList<Key> []) new ArrayList[10];
このキャストは基本的に、有効な型である生の ArrayList オブジェクトの配列が必要であることをコンパイラーに伝えます。
ネストされたリストの使用
別のオプションは、リストのリストを使用することです:
ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();
この場合、 b は ArrayList オブジェクトのリストであり、各 ArrayList は Key 型の要素を保持できます。 ArrayList は配列型ではないため、このアプローチは正当です。
追加情報
このトピックの詳細については、公式 Java チュートリアルの第 7.3 章を参照してください。ワイルドカード型でない限り、配列型がコンポーネントとして型変数を持つことができない方法について説明します。
以上がJava でジェネリック リストの配列を作成できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。