2016-04-03 11 views
1

私はジェネリックメソッドを持っていますが、どのようにしてTのクラスを取得できますか?ジェネリックメソッドのジェネリック型のクラスインスタンスを取得する方法

class MyClass 
{ 
    static <T> void foo(T t) 
    { 
     // how to get T.class 
    } 
} 

t.getClass()は、ほとんどの派生クラスを取得しますが、それはMyClassの場合には動作しませんので、Tは、スーパークラスである可能性があります。 <コレクション> foo(新しいArrayList())。

+4

を呼び出します。タイプ消去について読んでください。あなたができる最善の方法は、別のパラメータ 'Class clazz'をメソッドに追加することです。 –

+0

この場合、 'T'はコンパイル時に' Object'です。したがって、 'Object.class'がトリックを行います。さもなければ、 't.getClass()'はどうでしょうか? P.S.誰にもこれは消去と何か関係があると言ってもらえません。そうではありません。あなたは 'T'の境界を定義していません。 –

+0

'' 'T'''は_weak_型ですが、' '' 'getClass()' 'は_strong_型のクラスを返します。 [この質問]を参照してください(http://stackoverflow.com/questions/106336/how-do-i-find-out-what-type-each-object-is-in-a-arraylistobject) –

答えて

2

署名を保持したい場合は不可能です。しかし、型を別の引数として提供することでこれを解決する方法があります。

static <T> void foo(T t, Class<T> cls) { 
    // use cls 
} 
その後

代わりの

MyClass.<Collection> foo(new ArrayList()); 

を呼び出し、あなたはそれは不可能だ

MyClass.foo(new ArrayList(), Collection.class); 
+0

私はC++から来ています。ここでは、ジェネリックを使って型をたくさん推論しています。悲しいことに、Javaでは不可能です。 –

関連する問題