Java获取泛型真实类型的方法

1、获取父类泛型类的泛型

复制代码
public abstract class AbstractDao<T> {
    public Class<T> getActualType() {
        ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
        return (Class<T>) parameterizedType.getActualTypeArguments()[0];
    }
}

public class UserDao extends AbstractDao<String> {
    public static void main(String[] args) {
        UserDao userDao = new UserDao();
        Class<String> actualType = userDao.getActualType();
        System.out.println(actualType.getName());
    }
}
复制代码

2、获取成员变量的泛型

复制代码
public class User {
    private List<String> list;
    public static void main(String[] args) {
        try {
            Field field = User.class.getDeclaredField("list");
            Type genericType = field.getGenericType();
            if (genericType != null && genericType instanceof ParameterizedType) {
                Type actualType = ((ParameterizedType) genericType).getActualTypeArguments()[0];
                System.out.println(actualType.getTypeName());
            }
        } catch (Exception e) {
        }
    }
}
复制代码

3、获取局部变量的泛型,注意:泛型必须以匿名内部类的方式

复制代码
public abstract class AbstractDao<T> {

    public Class<T> getActualType() {
        ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
        return (Class<T>) parameterizedType.getActualTypeArguments()[0];
    }

    public static void main(String[] args) {
        AbstractDao<String> dao = new AbstractDao<String>() {
        };
        System.out.println(dao.getActualType().getTypeName());
    }
}
复制代码

 

4、通过接口/父类的匿名内部类作为参数传递到方法

在方法中可以获得匿名内部类继承的父类或实现的接口的泛型的真实类型

 AbstractDao如参考例子一,是一个带泛型的抽象类

 

 

 

打印如下:

 

总结一下
如果是继承基类而来的泛型,就用 getGenericSuperclass() , 转型为 ParameterizedType 来获得实际类型
如果是实现接口而来的泛型,就用 getGenericInterfaces() , 针对其中的元素转型为 ParameterizedType 来获得实际类型
我们所说的 Java 泛型在字节码中会被擦除,并不总是擦除为 Object 类型,而是擦除到上限类型
能否获得想要的类型可以在 IDE 中,或用 javap -v <your_class> 来查看泛型签名来找到线索

 

转载:https://blog.csdn.net/qq_30038111/article/details/100611523

https://blog.csdn.net/hj7jay/article/details/54889717

 

 

 

 

 

posted @   迷走神经  阅读(6374)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示