私はパラメータ化されたクラスを持っています。私は、クラス名で表されるクラスの名前を取得したいと思います。たとえば、私がしたいことは次のとおりです。パラメータ化された型のアクセスクラス名
public T foo(){
System.out.println(T.class.getName());
}
私はパラメータ化されたクラスを持っています。私は、クラス名で表されるクラスの名前を取得したいと思います。たとえば、私がしたいことは次のとおりです。パラメータ化された型のアクセスクラス名
public T foo(){
System.out.println(T.class.getName());
}
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ジェネリックで許可されているのはすべてです。
実際、あなたは 'T 'が何であるかを知ることができます。どのように私の答えを参照してください。 (なぜそれがdownvotedされたか分からない!) – ziesemer
@ziesemerあなたは実際にそこにある境界に得ることができます。上記のTが「T extends Something」と宣言されていれば、あなたは何かを得ることができます。しかし、型変数に境界がない場合には何も得られません。 –
T
はコンパイル時には分かっていないので、このようにすることはできません。これはT
のインスタンスを受け取り、そのダイナミックタイプの名前をプリントアウトすることを
public void foo(T t) {
System.out.println(t.getClass().getName());
}
注:あなたはそうのような似たような達成できます。
これが十分な代替品であるかどうかは、使用例によって異なります。
さらに、これは 't'のクラスの名前を与えます。これは、typeパラメータのサブクラスになります。 –
@StephenC:これは私が "* dynamic * type"の意味です。 – NPE
public T foo(T t){
System.out.println(t.getClass().getName());
}
ありがとう、Sean。忘れてしまった。 – Thom
http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime possible duplicate –
はい、複製します。同意します。これをどうやって解決するのですか? – Thom