Java汎用クラスの型変数からClassオブジェクトを取得する方法はありますか?次のようなものがあります:
public class Bar extends Foo<T> {
public Class getParameterClass() {
return T.class; // doesn't compile
}
}
この型情報はコンパイル時に利用できるため、型消去の影響を受けないようにする必要があります。したがって、理論的には、これを実現する方法が必要です。それは存在しますか?
これは機能します:
public static class Bar extends Foo<String> {
public Class<?> getParameterClass() {
return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
}
}
コードスニペットは少し紛らわしいです。 Tは型パラメータですか、それともクラスですか?
public static class Bar extends Foo<String> {
public Class<?> getParameterClass() {
return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
}
}
public static class Bar2<T> extends Foo<T> {
public Class<?> getParameterClass() {
return (Class<?>) (((ParameterizedType)Bar2.class.getGenericSuperclass()).getActualTypeArguments()[0]);
}
}
public static void main(String[] args) {
System.out.println(new Bar().getParameterClass());
System.out.println(new Bar2<Object>().getParameterClass());
}
実際には、2番目のprintlnによって例外が発生します。
このコードは、派生クラスでも機能します。
import Java.lang.reflect.ParameterizedType;
public abstract class A<B>
{
public Class<B> getClassOfB() throws Exception
{
ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
return (Class<B>) superclass.getActualTypeArguments()[0];
}
}
ここから引っ掛かる: https://stackoverflow.com/a/4699117/2651