2012-01-23 11 views
0

私はパラメータ化されたクラスを持っています。私は、クラス名で表されるクラスの名前を取得したいと思います。たとえば、私がしたいことは次のとおりです。パラメータ化された型のアクセスクラス名

public T foo(){ 
    System.out.println(T.class.getName()); 
} 
+0

ありがとう、Sean。忘れてしまった。 – Thom

+0

http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime possible duplicate –

+0

はい、複製します。同意します。これをどうやって解決するのですか? – Thom

答えて

1

Javaジェネリックはそのようには動作しません。 Tに任意の境界がある場合は、型変数定義を照会することによって境界にアクセスできます。例えば:

public class Foo<T extends Bar>{} 

は、あなたがBarで取得できるようになるが、Barのサブタイプで、あなたが実際に使用していません。それはうまくいきません、申し訳ありません。

詳細についてはJava Generics FAQをお読みください。

ところでこの問題の一般的な解決策の1つは、Tのサブタイプをクラスに渡すことです。

public T foo(Class<? extends T> tType){ 
    System.out.println(tType.getName()); 
} 

私はそれが面倒だと知っていますが、Javaジェネリックで許可されているのはすべてです。

+0

実際、あなたは 'T 'が何であるかを知ることができます。どのように私の答えを参照してください。 (なぜそれがdownvotedされたか分からない!) – ziesemer

+0

@ziesemerあなたは実際にそこにある境界に得ることができます。上記のTが「T extends Something」と宣言されていれば、あなたは何かを得ることができます。しかし、型変数に境界がない場合には何も得られません。 –

2

Tはコンパイル時には分かっていないので、このようにすることはできません。これはTのインスタンスを受け取り、そのダイナミックタイプの名前をプリントアウトすることを

public void foo(T t) { 
    System.out.println(t.getClass().getName()); 
} 

注:あなたはそうのような似たような達成できます。

これが十分な代替品であるかどうかは、使用例によって異なります。

+0

さらに、これは 't'のクラスの名前を与えます。これは、typeパラメータのサブクラスになります。 –

+0

@StephenC:これは私が "* dynamic * type"の意味です。 – NPE

0
public T foo(T t){ 
    System.out.println(t.getClass().getName()); 
} 
関連する問題