java 泛型反射 获取失败

发布于 2022-09-12 02:22:18 字数 818 浏览 20 评论 0

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失败了呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

葬シ愛 2022-09-19 02:22:18

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

Children<String> children = new Children<String>(){};
淑女气质 2022-09-19 02:22:18

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

Type actualTypeArgument = ((ParameterizedType) getClass().getGenericSuperclass())
                .getActualTypeArguments()[0];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文