これは、物事をどのように行うかという問題ではありません。どうしてそうなるのかという問題です。
Java の配列は、実行時にコンポーネントの型を認識します。また、型消去のために、ジェネリック型変数の配列オブジェクトを持つことはできません。ジェネリックを含む配列型は許可され、健全な読み取り/書き込みがチェックされます。唯一の問題は、アロケーター式のようです。
Java コンパイラでは、次のことも許可されていないことに注意してください。
Pong<Integer> lotsofpong [] = new Pong<Integer>[100];
...どこにあるPong
のは、古いパラメトリック クラスです。ここには未知のものは何もありません。はい、実行時にlotsofpong
は単に の配列になりますがPong
、コンパイラがコンパイル時の目的で型パラメーターを記憶できない理由がわかりません。これらの型はコンパイル時に存在するため、実際にはそれを覚えています。したがって、唯一の問題は、コンパイル時にアロケーターに特定の汎用パラメーター関連のコンポーネント型を与えることを拒否しているようです。
のパラメーターがPong
ジェネリック型変数であったとしても、違いはありません。動的配列は依然として の配列でありPong
、要素ごとに のサイズが必要でありPong
、型パラメーターに依存しません。
はい、それを回避する方法があることを知っています-非パラメトリック型からのキャスト (おそらく SuppressWarning を使用) を使用するかPong<Integer>
、非パラメトリック クラスでサブクラス化し、代わりにその型を使用します。しかし、この種のアロケーターが許可されない理由はありますか?