当前位置: 首页 > news >正文

在Java中识别泛型信息

Java中泛型信息在编译时由于类型擦除的原因,通常是不可获取的。类型擦除是Java在编译泛型代码时采取的一种措施,用于保证新的泛型代码能与旧的非泛型代码兼容。它将泛型类型参数替换为它们的边界,如果类型参数是无边界的,那么就会替换为Object。

尽管类型擦除会移除大部分泛型类型信息,但通过反射机制,我们依旧能获取到一定范围内的泛型信息。具体来说,可以通过获取类型相关的 ParameterizedType信息来检查类、方法和字段上的泛型信息。以下是一些在Java中如何获取泛型信息的方法和步骤。

  1. 获取泛型类的类型参数:
    当创建一个泛型类的对象时,无法直接得知其具体的类型参数,因为这些信息在运行时不可访问。但是,如果类继承了带有泛型参数的父类,可以通过如下方式获取:

    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;class GenericClass<T> {}class StringGenericClass extends GenericClass<String> {}public class GenericTypeTest {public static void main(String[] args) {StringGenericClass stringGenericClass = new StringGenericClass();Type genericSuperclass = stringGenericClass.getClass().getGenericSuperclass();if (genericSuperclass instanceof ParameterizedType) {ParameterizedType type = (ParameterizedType) genericSuperclass;Type[] typeArguments = type.getActualTypeArguments();for (Type typeArgument : typeArguments) {Class typeArgClass = (Class) typeArgument;System.out.println("Type Argument: " + typeArgClass.getSimpleName());}}}
    }

    这段代码检查了 StringGenericClass从其泛型父类 GenericClass继承的泛型类型参数。

  2. 获取泛型方法的返回类型和参数类型:
    可以通过反射得到定义了泛型返回类型或泛型参数类型的方法信息。实现过程如下:

    import java.lang.reflect.Method;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;class GenericClass {public <T> T genericMethod(T t) {return t;}
    }public class GenericTypeTest {public static void main(String[] args) throws Exception {Method method = GenericClass.class.getMethod("genericMethod", Object.class);// 获取泛型返回类型Type returnType = method.getGenericReturnType();if (returnType instanceof ParameterizedType) {ParameterizedType type = (ParameterizedType) returnType;Type[] typeArguments = type.getActualTypeArguments();for (Type arg : typeArguments) {System.out.println("Return type argument: " + arg);}}// 获取泛型参数类型Type[] genericParameterTypes = method.getGenericParameterTypes();for (Type genericParameterType : genericParameterTypes) {if (genericParameterType instanceof ParameterizedType) {ParameterizedType paramType = (ParameterizedType) genericParameterType;Type[] paramTypeArguments = paramType.getActualTypeArguments();for (Type paramArgType : paramTypeArguments) {System.out.println("Parameter type argument: " + paramArgType);}}}}
    }
    ​

    通过这段代码,我们可以查询 genericMethod方法的泛型返回类型和参数类型。

  3. 获取泛型字段的类型参数:
    如果有一个泛型字段,我们也可以利用反射来获取其泛型类型参数:

    import java.lang.reflect.Field;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;class GenericClass {public List<String> stringList;
    }public class GenericTypeTest {public static void main(String[] args) throws Exception {Field field = GenericClass.class.getField("stringList");Type genericFieldType = field.getGenericType();if (genericFieldType instanceof ParameterizedType) {ParameterizedType type = (ParameterizedType) genericFieldType;Type[] fieldArgTypes = type.getActualTypeArguments();for (Type fieldArgType : fieldArgTypes) {System.out.println("Field type argument: " + fieldArgType);}}}
    }
http://www.rkmt.cn/news/8969.html

相关文章:

  • Kali Linux 光标与快捷键全攻略
  • Docker - ZZH Ubuntu Image - Desktop
  • 图解17:5中网络IO模型
  • 【session反序列化】 - 指南
  • 在k8s集群中解决master节点与node通信
  • PHP中常见数组操作函数
  • 修复Ubuntu系统文件损坏:手动fsck指令
  • window表现驱动开发—视频呈现网络简介
  • 一类特征方程在数列递推中的应用
  • 深入解析:GC 算法的种类及垃圾收集器
  • rust跨文件调用代码
  • 深入解析:深度学习从入门到精通 - AutoML与神经网络搜索(NAS):自动化模型设计未来
  • 个人项目-文本查重
  • 深入解析:[数据结构] LinkedList
  • 数字图像基础知识
  • 设置Redis在CentOS7上的自启动配置
  • 挂载配置文件以Docker启动Redis服务
  • ​​Final Cut Pro 11.0 for Mac 剪视频安装教程|DMG文件安装步骤详解​(附安装包)
  • 实用指南:物联网赋能24H共享书屋:智能化借阅管理的完整解决方案!
  • 准备工作之动态内存分配[基于郝斌课程]
  • 2025.6第一套六级听力生词
  • CSP-S 2025游记
  • atof() - 字符串转double类型
  • 深入解析:解密llama.cpp:从Prompt到Response的完整技术流程剖析
  • 详细介绍:深圳比斯特|电池组PACK自动化生产线厂家概述
  • 密码学学习记录(三)
  • 知行合一
  • 深入解析:解锁AI智能体:上下文工程如何成为架构落地的“魔法钥匙”
  • 小狼毫雾凇拼音安装部署
  • Linux 内核VRF