java 泛型反射 获取失败

public class Parent<T> {
}
public class Children<T> extends Parent<T> {
    private Class<T> type;
    public Class<T> getType() {
        Type actualTypeArgument = ((ParameterizedType) getClass().getGenericSuperclass())
                .getActualTypeArguments()[0];
        return (Class<T>) actualTypeArgument;
    }
    public static void main(String[] args) {
        Children<String> children = new Children<>();
        Class<String> type = children.getType();
        System.out.println(type.getName());
    }
}

想要获取泛型的Class,但是失败了:Exception in thread "main" java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
为什么Type强转Class失败了呢?

阅读 12.8k
2 个回答

因为泛型擦除,所以只能拿到T拿不到具体类型(如果能拿到的话就太好了…
这种场景想拿到必须有个子类具体指定了T的类型,比如改成这样就能拿到了:

Children<String> children = new Children<String>(){};

我的理解:
这段代码,拿的应该是父类的泛型类型。 但是,Children<T> 继承 Parent<T>。 此时返回的 参数是 T。 这个不是一个 class。 如果 将代码修改为 Children<T> extends Parent<String>。 那么这时候,代码就不会报错了。

Type actualTypeArgument = ((ParameterizedType) getClass().getGenericSuperclass())
                .getActualTypeArguments()[0];
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题