2011-11-14 8 views
1

クラスのフィールド(リフレクトを使用)からジェネリックでクラスをインスタンス化するタイプを使用したいと思います。
注:読みやすくするために必要な例外は除きました。別のクラスのフィールド型を使用してパラメータ化されたクラスをインスタンス化します

public class AClass { 
    class BClass<T> { 
     T aMemba; 
    } 

    public void AMethod() { 
     Class c = Class.forName("com.bla.flipper"); 
     Field f = c.getField("flipIt"); 

     // Here is my difficulty, I want to instantiate BClass with the type of 
     // field 'f' but the compiler won't let me. 
     Class typeClass = f.getType(); 
     BClass<typeClass> = new BClass<typeClass>(); 
    } 
} 

私は妥当なものを達成したいですか?どのように私はこの問題を解決することができますか?

ありがとうございます!

BClass<typeClass> = new BClass<typeClass>(); 

typeClassコンパイラが知っておくべきものです:あなたは次の行を見ればので、あなたがやろうとしているものは何でも

+0

物事の多くは、「合理的」です...スレッジハンマーを地面にポールを駆動するためではなくとして合理的ですたたき飛ぶ。だから、もしあなたがポールを地面に打ち込んでいるのであれば、スレッジハンマーを使うのが妥当です。フィールドの型が変更される可能性があるクラスのフィールド型に基づいてクラスをインスタンス化する場合は、リフレクションを使用するのが妥当です。 – Kiril

+1

Javaでジェネリックスを使用したい場合は**すぐに**学習する必要があります。http://download.oracle.com/javase/tutorial/java/generics/erasure.html –

答えて

1

あなたは型クラスの型の型引数をキャプチャすることができます。

Field f = ...; 
Class<?> typeClass = f.getType(); 
withClassCapture(typeClass); 

private <T> void withClassCapture(Class<T> klazz) { 
    BClass<T> instance = new BClass<T>(); 
    // ... do your thing 
} 
+0

ベン、スニペットのおかげで。私はそれが大好きで、私たちはそのようなトリックをすることができるとは思っていませんでした。 – Gilbeg

2

は合理的ではありません。しかし、あなたのケースでは、それはリフレクションを通じて実行時にのみ知られています。

BClass<T>Tを消去し、コンパイル時にあなたのケースで不明な具体的なタイプに置き換える必要があります。論理的には無効です。

+0

ありがとうBhesh、私が出会った最も論理的な説明。 – Gilbeg

+0

@ギルベグ:問題ありません。 –

関連する問題