型消去のために表示できないジェネリックを介してパラメーター化されたaがType aあるとします。'java.lang.Integer'である。java.util.TreeSet<T>もあります。を構築するにはType bどうすればよいですか?ParameterizedTypejava.util.TreeSet<java.lang.Integer>
あるいは、もっと簡単な場合は、rawjava.util.TreeSetタイプを使用することもできます。
型消去のために表示できないジェネリックを介してパラメーター化されたaがType aあるとします。'java.lang.Integer'である。java.util.TreeSet<T>もあります。を構築するにはType bどうすればよいですか?ParameterizedTypejava.util.TreeSet<java.lang.Integer>
あるいは、もっと簡単な場合は、rawjava.util.TreeSetタイプを使用することもできます。
ParameterizedType次のように実装します。
public class MyParamType implements ParameterizedType {
private Type rawType;
private List<Type> paramTypes;
public MyParamType( Type raw ) {
this.rawType = raw;
}
public void addParamType( Type t ) {
paramTypes.add(t);
}
//for the interface methods, just return what you stored before
}
に対して多かれ少なかれ同じことを行いTypeます。Type非ジェネリック型 (マーカー インターフェイスにすぎません) に対して実際に実装する必要があるものについてさらにヒントが必要な場合は、JDK ソースを参照するか、デバッガーで具体的なインスタンスを参照してください。
あなたは自分の質問に答えの半分を与えました。型パラメーター (あなたの場合は Integer) は、コンパイル時にのみ存在する消去です。したがって、コードの開発中に作成したい場合は、次のようにSet<Integer>言えます。
Set<Integer> myset = new TreeSet<Integer>();
または、幸運な Java 7 ユーザーの場合はさらに短い:
Set<Integer> myset = new TreeSet<>();
ただし、この行はプレーン コードにコンパイルされます。
Set myset = new TreeSet();
したがって、TreeSet<Integer>実行時に のインスタンスを作成したい場合は、プレーンのインスタンスを作成するだけTreeSetです Class.forName(className).newInstance()。この場合、型パラメータIntegerは関係ありません。
編集:私はあなたのコメントを読んで、なぜあなたが尋ねているのか理解しました. 本当に必要な場合は、 : のサブクラスを作成できTreeSetますclass IntegerTreeSet extends TreeSet<Integer>。のパラメータ タイプは、IntegerTreeSetリフレクション API を使用して検出できます。
このクラスは、静的に (コードにこれを記述するだけで) 作成することも、Javassist や CGLIB などのツールを使用して動的に作成することもできます。