Javaは、パラメーター化された型のジェネリック配列を作成できません



Java Cannot Create Generic Array Parameterized Types



次に示すように、Javaジェネリックスでパラメーター化された型の配列をインスタンス化することはできません。

Pair<String>[] table = new Pair<String>[10] //Error

どうしてこれなの?実際、主な目的は、配列内の型が一貫していない要素を回避することです。



配列が他のタイプの要素を格納できるかどうかを最初に見てみましょう

Pair[] table = new Pair[10] table[0] = new Object() //Compile Error

明らかに直接保存すると、コンパイラはエラーを報告します。では、配列を変換して再度保存しますか?



Pair[] table = new Pair[10] Object[] o = table //Automatic conversion o[0] = new Object()

現時点では、コンパイラはエラーを報告しませんが、実行時にスローします ArrayStoreException 異常な

配列ストレージチェックは非常に厳密であり、保存することしかできないことを説明します 作成時の要素タイプ

ただし、一般的な消去はこのメカニズムを破壊します。次に例を示します。



Pair<String>[] table = new Pair<String>[10] //Assuming it can Object[] o = table //Generic erasure becomes Pair[], and upwards are automatically converted to Object[] o[0] = new Pair<Double>()

この時点で、Pair要素がPair配列に格納されていることがわかります。

もちろん、次の条件はまだ受け入れられません。

o[1] = new Object() // No error is reported when compiling, and an exception is thrown when running

つまり、Javaでは、配列のセキュリティを保護するためにパラメータ化されたジェネリック配列を作成することはできません。

さらに、パラメーター化されたジェネリック配列は作成できませんが、ワイルドカードジェネリック配列は作成できます。

Pair<?>[] table = new Pair<?>[10]

これが可能なのは、新しいペアは、配列がペアやペアなどの任意のパラメーターのペアを格納できることを意味するためです。

また、作成することもできます

Pair<String>[] table = new Pair[10] //Compatible conversion, not parent-child relationship table[0] = new Pair<Double> //Compile Error

このとき、配列の実際の型はペアですが、ペアとして宣言されているため、エラーが報告されます。
その理由は、ジェネリック型とプリミティブ型は変換できますが、継承されないためです。ペアをペアに変換して保存できるはずですが、宣言されたペアはペアの親ではないため、ペアを保存できないのは当然のことです。

ただし、次の方法は正常に機能します

Object[] o =table o[0] = new Pair<Double>