Java でジェネリック リストの配列を作成できないのはなぜですか?

Barbara Streisand
リリース: 2024-11-03 17:24:30
オリジナル
144 人が閲覧しました

Why Can't I Create an Array of Generic Lists in Java?

ジェネリック配列と型消去の謎

ジェネリックを扱うとき、なぜ一部の配列宣言が許可され、他の宣言が許可されないのか混乱することがあります。って。次の点を考慮してください:

ArrayList<Key> a = new ArrayList<Key>(); // Compiles fine
ログイン後にコピー

このコードは問題なくコンパイルされます。ただし、汎用リストの配列:

ArrayList<Key>[] a = new ArrayList<Key>[10]; // Compiler error
ログイン後にコピー

の場合、コンパイラはエラーを出します。なぜそうなるのですか?

型消去の役割

この問題は、Java の型消去の概念に起因しています。ジェネリック型がコンパイルされると、その型パラメーターは削除され、生の型に置き換えられます。これは、実行時にすべてのジェネリック型が対応する生の型として扱われることを意味します。

最初の例では、ArrayListはジェネリック型ですが、実行時には ArrayList として扱われます。したがって、 は Key 型の要素を持つ ArrayList オブジェクトを保持できます。

ただし、配列の場合は話が異なります。配列の各要素は同じ型でなければなりません。したがって、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!