Java の汎用機能を使用すると、タイプセーフなコンテナを作成できますが、次のような場合に課題に直面します。配列を扱うこと。これらの制限を理解することは、予期しないエラーを回避するために非常に重要です。
配列は共分散を示します。これは、スーパータイプの配列がサブタイプの要素を保持できることを意味します。 。ただし、ジェネリックはより強力な型チェックを強制し、この動作を許可しないため、コンパイル時に型の安全性が確保されます。
配列配列ストア チェックを使用して、実行時に型チェックを強制します。一方、ジェネリックでは型が消去されます。つまり、実行時に型情報が失われます。この違いにより、ジェネリックと配列を操作するときに分岐操作が発生します。
public <T> T[] getArray(int size) { T[] arr = new T[size]; // Type-unsafe, not allowed return arr; }
実行時、この配列は実際には Object[] になります。これは、たとえば Integer[] の参照に割り当てられた場合、正しく型チェックされません。
コード E[] 要素 = (E[]) new Object[10];警告を抑制するタイプキャストによって機能します。ただし、この回避策は常に安全であるとは限らず、特に信頼できない入力を処理する場合に実行時エラーが発生する可能性があります。
配列の作成は無制限のワイルドカード型は具体化可能であるため許可されます。つまり、指定されていない型パラメータがあることを意味します。配列は任意の型の要素を保持できるため、これは安全です。
public <E> E[] getArray(Class<E> clazz, int size) { @SuppressWarnings("unchecked") E[] arr = (E[]) Array.newInstance(clazz, size); return arr; }
以上がJava でジェネリック配列を作成できないのはなぜですか? 安全な代替配列は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。