有没有办法从Java泛型类的类型变量中获取Class对象?这样的事情:
public class Bar extends Foo<T> {
public Class getParameterClass() {
return T.class; // doesn't compile
}
}
此类型信息在编译时可用,因此不应受类型擦除的影响,因此,理论上应该有一种方法可以实现此目的。它存在吗?
答案 0 :(得分:25)
这有效:
public static class Bar extends Foo<String> {
public Class<?> getParameterClass() {
return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
}
}
答案 1 :(得分:6)
代码段有点令人困惑。 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());
}
实际上第二个println会导致异常。
答案 2 :(得分:3)
此代码也适用于派生类:
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];
}
}