次のようなことができる方法は絶対にないと思います:
Class c = Class.forName("Processor<Integer, String>");
Javaで?(もちろん、以前にプロセッサを定義した場所)。
次のようなことができる方法は絶対にないと思います:
Class c = Class.forName("Processor<Integer, String>");
Javaで?(もちろん、以前にプロセッサを定義した場所)。
ジェネリック引数はコンパイル時にのみ存在できるため、絶対に方法はありません。Class
オブジェクトは実行時に同じです。C++ のようなクラス テンプレートではありません。型パラメーターは、Java コンパイラーの単なる情報です。
クラスを作成することで、同様のことを達成することができます:
class IntStringProcessor extends Processor<Integer, String> {}
とClass c = Class.forName("IntStringProcessor");
実行時に実際のProcessor
型パラメーターを取得できますc.getGenericSuperclass()
が、これは私が推測する質問を拡張します。
編集:別のアイデア
クラスProcessor
をパラメーターとして保持してから、次のことができます。
Class c1 = Class.forName("java.lang.Integer");
Class c2 = Class.forName("java.lang.String");
Processor = new Processor(c1,c2);
プロセッサは汎用ではなくなりましたが、内部で Class インスタンスを使用しています。私が言ったように、ジェネリックはコンパイル時にのみ存在するため、実行時にジェネリック インスタンスを作成する方法はありません。
まず、何かをまっすぐにさせてください。Class
のJava にはオブジェクトがありませんProcessor<Integer, String>
。Class
のオブジェクトは 1 つだけ ですProcessor
。つまり、すべての一般的なインスタンス化が同じオブジェクトProcessor.class
を共有します。Class
Processor<Integer, String> x = new Processor<Integer, String>();
Processor<Character, Byte> y = new Processor<Character, Byte>();
System.out.println(x.getClass() == y.getClass()); // prints true
そうは言っても、ジェネリック型のトークンを渡すだけでよい場合は、サードパーティの実装を使用できます。ここではJava ClassMateを使用します。
TypeResolver typeResolver = new TypeResolver();
// type token for Processor<Integer, String>
ResolvedType type = typeResolver.resolve(Processor.class, Integer.class, String.class);
System.out.println("type = " + type);
ファイルからJava 型の名前を として読み取る場合はString
、おそらくmyリテラルClass.forName()
の代わりに使用することをお勧めします。.class
<
,ブラケットを自分で解析する必要がありますが>
、これらの単一文字は Java 型名で常に同じことを意味するため、簡単なはずです...
次のように、ネストされたパラメーターを形成できます。
// type token for Processor<Processor<Integer, String>, Character>
ResolvedType type = typeResolver.resolve(Processor.class,
typeResolver.resolve(Processor.class, Integer.class, String.class),
typeResolver.resolve(Character.class)
);
System.out.println("type = " + type);
コンパイル時にわかっている型の型トークンを作成する場合は、いわゆるスーパー型トークン パターンを使用できます。必要なタイプ名を中に入れるだけですnew GenericType<...>() {}
:
type = typeResolver.resolve(new GenericType<Processor<Processor<Integer, String>, Character>>() {});
System.out.println("type = " + type);