ホームページ > Java > &#&チュートリアル > Java でジェネリック リストの配列を宣言できないのはなぜですか?

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

Susan Sarandon
リリース: 2024-11-03 13:05:03
オリジナル
819 人が閲覧しました

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

ジェネリック配列の不完全な消去

ジェネリック配列は、型消去の概念により Java に特有の課題を引き起こします。この記事では、一見似ている 2 つのコードの違いを調査し、コンパイラの動作の根本的な理由を明らかにします。

構文とセマンティクス

次のコードを考えてみましょう:

<code class="java">ArrayList<Key> a = new ArrayList<Key>();</code>
ログイン後にコピー

このコードは、汎用の ArrayList のインスタンスを作成するため、問題なくコンパイルされます。ただし、次のコードはコンパイル エラーになります。

<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>
ログイン後にコピー

型消去の公開

矛盾を理解するには、型消去の概念を詳しく掘り下げる必要があります。コンパイル中にジェネリック型情報が消去されます。つまり、実行時には生の型 (この場合は ArrayList) のみが利用可能になります。

生の配列と型固有のリスト

配列には生の型が必要ですが、最初のコード部分は追加の型情報なしで汎用リスト (ArrayList) への参照を作成します。したがって、コンパイラは型を問題なく解決できます。

ただし、2 番目のコード部分は、ジェネリック リストへの参照の配列を作成しようとします。配列はパラメトリック型ではなく、型変数やパラメーター化された型を受け入れることができないため、これは型安全規則に違反します。

型キャストの解決策

この制限を回避するには、次のように配列を型キャストできます。

<code class="java">ArrayList<Key>[] a = (ArrayList<Key>[]) new ArrayList[10];</code>
ログイン後にコピー

キャストでジェネリック型情報を明示的に指定することにより、配列要素の意図された型についてコンパイラーに通知します。これはコンパイラの型安全性要件を満たします。

リストのリスト (LL) アプローチ

代わりに、リストのリストを使用することもできます。

<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
ログイン後にコピー

これは正当であるため、 ArrayList は配列ではありません。外側の ArrayList の各要素は ArrayList であり、完全にインスタンス化された型です。

型の安全性と理論的根拠

型の安全性を強制するために、ジェネリック配列に対するコンパイラの制限が設けられています。これらのチェックがなければ、さまざまな型のリストを汎用リストの配列に割り当てることで、微妙な実行時エラーが簡単に発生してしまいます。

コンパイラーの動作の背後にある理由を理解することで、いつどのように情報に基づいた意思決定を行うことができます。汎用配列とリストのリストを使用して、コードの正確さと保守性の両方を確保します。

以上がJava でジェネリック リストの配列を宣言できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート