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

`ParameterizedType` 和 `TypeVariable` 的区别

在 Java 的泛型系统中,ParameterizedTypeTypeVariable 是两个不同的类型表示,它们都属于 java.lang.reflect.Type 接口的子接口。两者都在反射(Reflection)中用于描述泛型信息,但用途和含义不同。


🌟 一、概念区别

类型名称所属包含义
ParameterizedTypejava.lang.reflect表示一个参数化类型,即带有泛型参数的类型,例如 List<String>Map<Integer, String> 等。
TypeVariablejava.lang.reflect表示类型变量,也就是泛型中的占位符,如 TKV 等。

🧩 二、具体解释

1. ParameterizedType

  • 定义:
    表示一个已经被参数化的泛型类型。

  • 常见例子:

    • List<String>
    • Map<Integer, User>
    • Optional<T>
  • 方法:

    Type[] getActualTypeArguments(); // 获取实际类型参数,如 String、Integer
    Type getRawType();                // 获取原始类型,如 List、Map
    Type getOwnerType();              // 如果是内部类,返回外部类类型
    
  • 使用场景:
    在反射中获取字段或方法的返回值类型时,如果它是参数化类型,就会返回 ParameterizedType

示例:
Field field = MyClass.class.getDeclaredField("list");
Type type = field.getGenericType();if (type instanceof ParameterizedType pType) {Type rawType = pType.getRawType(); // java.util.ListType[] typeArgs = pType.getActualTypeArguments(); // [class java.lang.String]
}

2. TypeVariable

  • 定义:
    表示泛型中的类型变量(通常用 T、E、K、V 表示),这些变量会在编译后被擦除,但在反射中可以获取其信息。

  • 常见例子:

    • 泛型类定义中的 <T>
    • 方法签名中的 <K, V> Map<K,V> getMap()
  • 方法:

    String getName();                  // 获取变量名,如 "T"
    Type[] getBounds();                // 获取上界,默认是 Object
    GenericDeclaration getGenericDeclaration(); // 返回声明该变量的类或方法
    
  • 使用场景:
    当你查看泛型类或方法的类型参数时,会得到 TypeVariable

示例:
public class Box<T> {private T value;
}Field field = Box.class.getDeclaredField("value");
Type type = field.getGenericType();if (type instanceof TypeVariable<?> tv) {System.out.println(tv.getName());      // TSystem.out.println(Arrays.toString(tv.getBounds())); // [class java.lang.Object]
}

🔍 三、总结对比表

特性ParameterizedTypeTypeVariable
表示类型已经被参数化的类型泛型类型变量(未指定具体类型)
常见形式List<String>Map<K, V>TEK
是否有实际类型参数✅ 有 (getActualTypeArguments)❌ 没有
是否代表泛型变量
使用场景获取具体泛型类型信息获取泛型变量本身信息
是否能直接用于创建对象❌(运行时被擦除)❌(只是一个变量)

💡 四、关系说明

在泛型类型中,TypeVariable 是泛型参数的“名字”,而 ParameterizedType 是这个“名字”被替换为具体类型的实例。

比如:

class Box<T> {T content;
}
  • content 字段的泛型类型是 T,是一个 TypeVariable
  • 如果你在某个地方这样使用:
    Box<String> box = new Box<>();
    
    那么这里的 Box<String> 就是一个 ParameterizedType,其中 String 是对 T 的具体化

✅ 五、补充:其他相关类型

除了这两个类型外,Java 反射中还有几个重要的类型接口:

类型说明
Class<T>表示具体的类或基本类型
WildcardType表示通配符类型,如 ? extends Number? super String
GenericArrayType表示泛型数组,如 T[]

在处理 JSON 反序列化(如 Gson、Jackson)、动态代理、框架设计等需要保留泛型信息的场景,理解这些类型是非常关键的。

http://www.xdnf.cn/news/488665.html

相关文章:

  • C#实现访问远程硬盘(附源码)
  • 代码随想录 算法训练 Day3:链表1
  • X_T 转 STP 技术全解:从格式剖析到软件实操与迪威模型网在线转换指南
  • 数据标注的黄金标准:如何为机器学习构建可靠标签?
  • **练习案例2:点和圆的关系**设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
  • ML307R 的 USB Vendor ID (VID):0x2ECC ML307R 的 USB Product ID (PID):0x3012
  • 驱动芯片走线、过孔指导,大电流、散热过孔
  • Emacs 折腾日记(二十四)——帮助信息的一些优化
  • 【python实用小脚本-64】Python如何用图像比对解决办公效率难题?(附方案)
  • H3C华三配置AC自动上线AP
  • MySQL 第四讲---基础篇 数据类型
  • 【Linux网络】网络套接字编程
  • 泰迪杯特等奖案例深度解析:基于多级二值化与CNN回归的车牌识别系统设计
  • Mac上安装运行SynthTIGER
  • Spring AI 的功能介绍、集成使用和详细示例说明
  • 频域中的反射-信号完整性分析
  • 基于three.js 全景图片或视频开源库Photo Sphere Viewer
  • element plus el-upload 和el-image 配合图片上传和显示
  • IIS+php环境下执行exec函数后,服务器500错误宕机
  • 界面控件DevExpress WinForms中文教程:Banded Grid View - API
  • 解决LeetCode 47. 全排列 II 问题的正确姿势:深入分析剪枝与状态跟踪
  • 联合查询
  • ⭐️⭐️⭐️【模拟题及答案】:大模型Clouder认证:基于百炼平台构建智能体应用 ⭐️⭐️⭐️
  • CVPR2025 | 首个多光谱无人机单目标跟踪大规模数据集与统一框架, 数据可直接下载
  • 前端面经 8 JS中的this 手写call apply bind方法
  • 将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector
  • 火山引擎AI大模型
  • vue-router 中传递参数中的问题
  • 【基础】Windows开发设置入门3:在 Windows 11 上设置开发驱动器,提升性能速度
  • 适合使用分区表的典型业务场景