类型变量的Java类对象

时间:2010-05-10 08:24:51

标签: java generics type-erasure

有没有办法从Java泛型类的类型变量中获取Class对象?这样的事情:

public class Bar extends Foo<T> {
    public Class getParameterClass() {
        return T.class; // doesn't compile
    }
}

此类型信息在编译时可用,因此不应受类型擦除的影响,因此,理论上应该有一种方法可以实现此目的。它存在吗?

3 个答案:

答案 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];
    }
}

从这里抓住:https://stackoverflow.com/a/4699117/26510