Java のジェネリック配列: 包括的なダイブ
Java の配列とジェネリックは、一見すると互換性がないように見えるかもしれません。ジェネリックは型の安全性と柔軟性を可能にしますが、Java の配列は本質的に共変であり、実行時に要素の正確な型を保持することを意味します。これは、ジェネリック型の配列を作成しようとするときに問題になります。
次のコード スニペットを考えてみましょう:
<code class="java">public class Hash<T extends Comparable<String>> { private T[] hashTable; // ... }</code>
このコードは、Comparable を拡張するジェネリック オブジェクトの配列を作成しようとします。ただし、コンパイル中に表示されるエラー メッセージに見られるように、Java では、オブジェクト配列をパラメータ化された型の配列にキャストすることはできません。
java.lang.Object; cannot be cast to [Ljava.lang.Comparable;
この問題を回避するには、配列を使用できます。 newInstance() メソッド:
<code class="java">private Comparable[] hashtable; // ... hashtable = (Comparable[])Array.newInstance(Comparable.class, tableSize);</code>
ただし、このアプローチでもパラメーター化された型の配列は作成されません。 Java の配列は実行時に型安全であるため、自由に別の型にキャストすることはできません。
Java のジェネリックスは型消去を受け、コンパイル中に型パラメーターが削除されます。これにより、配列が特定の要素タイプを保持し、意図しないキャストが防止されます。その結果、特定のパラメーター化された型の配列を作成することはできません。
この特定のケースでは、配列の代わりに ArrayList を使用することをお勧めします。 ArrayList は動的なサイジングとジェネリックスのサポートを提供し、ほとんどのシナリオにより適しています。
この問題の詳細な説明については、Java Generics FAQ を参照してください: https://docs.oracle.com/javase/7 /docs/technotes/guides/generics/faq.html#コンポーネント タイプがコンクリートパラメータ化タイプである配列を作成できます
以上がJava でパラメータ化された型の配列を作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。