ホームページ >Java >&#&チュートリアル >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>
キャストでジェネリック型情報を明示的に指定することにより、配列要素の意図された型についてコンパイラーに通知します。これはコンパイラの型安全性要件を満たします。
代わりに、リストのリストを使用することもできます。
<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
これは正当であるため、 ArrayList は配列ではありません。外側の ArrayList の各要素は ArrayList
型の安全性を強制するために、ジェネリック配列に対するコンパイラの制限が設けられています。これらのチェックがなければ、さまざまな型のリストを汎用リストの配列に割り当てることで、微妙な実行時エラーが簡単に発生してしまいます。
コンパイラーの動作の背後にある理由を理解することで、いつどのように情報に基づいた意思決定を行うことができます。汎用配列とリストのリストを使用して、コードの正確さと保守性の両方を確保します。
以上がJava でジェネリック リストの配列を宣言できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。