1

次のようなことができる方法は絶対にないと思います:

Class c = Class.forName("Processor<Integer, String>");

Javaで?(もちろん、以前にプロセッサを定義した場所)。

4

2 に答える 2

2

ジェネリック引数はコンパイル時にのみ存在できるため、絶対に方法はありません。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 インスタンスを使用しています。私が言ったように、ジェネリックはコンパイル時にのみ存在するため、実行時にジェネリック インスタンスを作成する方法はありません。

于 2012-09-21T20:08:28.127 に答える
0

まず、何かをまっすぐにさせてください。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);
于 2012-09-22T23:05:35.850 に答える