2011-06-30 17 views
2

このよう宣言されたメソッドを持つクラス:ジェネリック型のクラスの型を取得しますか?

public class A{ 
    public <T> T test(java.lang.Class<T> classOfT) 
} 
通常

それは次のようにオブジェクトに対して呼び出すことができます。

A a = new A() 
String s = "test"; 
a.test(String.class); //I wrote this as s.class at first,which is wrong.Thanks Nick. 

私は、それに渡されたオブジェクトを一般化したいと思います私はこのようなクラスを宣言します:

public class B <T>{ 
    private A a = new A(); 
    private T obj = null; 
    T test(){return a.test(obj.getClass()); } 
} 

しかし、コードはコンパイルされません。私の目標を達成することは可能でしょうか?しかし、それは基本的にObjectで囲まれているのでTは、無制限である -

答えて

3
T obj = ...; 
obj.getClass() 

を試してみてください)。

は、事前のJavaの達人にありがとうつまり、Class<? extends Object>を返します。これはClass<?>と同じです。

だから、これをやって:

T test() { return a.test(obj.getClass()); } 

は、実際にTObjectを返す、タイプClass<?>のパラメータでa.testを呼び出し、そしてません。

パラメータをClass<T>に設定するか、戻り値の型をTに設定してください。これはうまくいくはずですが、なぜこのようなものが必要なのかまだ分かりません。また、オリジナルのポストでこの奇妙なエラーがあります:"test".classを行う

String s = "test"; 
a.test(s.class); 

は間違っている - それはString.classする必要があります。

あなただけ Tのタイプを決定するために classOfTパラメータを使用している場合

public class A{ 
    public <T> T test(java.lang.Class<T> classOfT) { ... } 
} 

として、あなたの関数を定義すると、あなたはでていないパラメータを使用してメソッドを定義したほうが良いかもしれません他の回答の補数で

1

は、最後の行がClass<? extends T>を返し

@SuppressWarnings("unchecked") 
T test() { 
    return (T) a.test(obj.getClass()); 
} 
2
Class<T> clazz = (Class<T>) obj.getClass(); 
return a.test(clazz); 
0

、すべて。例えば、上記の宣言の代わりにこの操作を行います。

public class A{ 
    public <T> T test() { ... } 
} 

をあなたはこの修飾されたメソッド呼び出しの構文を使用してそれを呼び出すことができますこの方法。これは私があなたのコードを書き換える方法は以下のようになります

public class A{ 
    public <T> T test() { 
      // ... 
    }   

    public static void main(String[] args) { 
      A a = new A(); 
      String result = a.<String>test(); 
    } 
} 

public class B <T> { 
    private A a = new A(); 

    T test() { 
     return this.a.<T>test(); 
    } 
} 

あなたはジェネリックA#test()機能におそらく、実行時に未使用であったであろうクラス・パラメータを、渡す必要はありませんこの方法です。 もちろん、実行時にclassOfTを使用すると、この解決策はあまり面白くないかもしれません...

関連する問題