JAvaは汎用クラス(T.class)を取り、T[]配列を作成する

805 ワード

Javaではclass Test{}が、TestクラスでTのインスタンスを作成する場合は、TのClassを取り、T[]のインスタンスを作成する場合は、直接使用できません
(new T()/new T[size]/T.classこれらはすべてエラーです.)
JAvaコードのコンパイル後、汎用型は消去されるので、取り出すのはそんなに簡単ではありません.
ClassではTは既にObjectとして消去されているが,真のTパラメータはTを使用する方法(あるいは変数宣言や他のTを使用する場所)に移されている(なければルートがない)ため,Tの具体的なカテゴリに反射することができず,T.classも得られない.一方getGenericSuperclass()はGeneric継承の特例であり,この場合サブクラスは親のGenericパラメータタイプを保存してParameterizedTypeを返し,親のT.classを取得することができ,これはサブクラスがどのTを継承すべきかを決定する方法である.
最初に汎用クラスを取り出します
Type t = getClass().getGenericSuperclass();

ParameterizedType p = (ParameterizedType) t ;

Class<T> c = (Class<T>) p.getActualTypeArguments()[0];

これでClassができたら、インスタンスを作成して何でもいいです.
配列を作成します.
(T[]) Array.newInstance( c , size ) ;