`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.mzph.cn/diannao/83295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PR-2021

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

unity使用ZXing.Net生成二维码

下载链接 https://github.com/micjahn/ZXing.Net 放到Plugins下即可使用

Ubuntu 编译SRS和ZLMediaKit用于视频推拉流

SRS实现视频的rtmp webrtc推流 ZLMediaKit编译生成MediaServer实现rtsp推流 SRS指定某个固定网卡&#xff0c;修改程序后重新编译 打开SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp&#xff0c;在 232 行后面添加&#xff1a; ZLMediaKit编译后文件存放在ZLMediakit/rele…

如何备考GRE?

1.引言 GRE和雅思不太相同&#xff0c;首先GRE是美国人的考试&#xff0c;思维方式和很多细节和英系雅思不一样。所以底层逻辑上我觉得有点区别。 难度方面&#xff0c;我感觉GRE不容易考低分&#xff0c;但考高分较难。雅思就不一样了不仅上限难突破&#xff0c;下限还容易6…

uniapp|商品列表加入购物车实现抛物线动画效果、上下左右抛入、多端兼容(H5、APP、微信小程序)

以uniapp框架为基础,详细解析商品列表加入购物车抛物线动画的实现方案。通过动态获取商品点击位置与购物车坐标,结合CSS过渡动画模拟抛物线轨迹,实现从商品图到购物车图标的动态效果。 目录 核心实现原理坐标动态计算抛物线轨迹模拟​动画元素控制代码实现详解模板层设计脚本…

React中使用openLayer画地图

OpenLayers&#xff08;简称ol&#xff09;是一个‌开源的WebGIS前端开发库‌&#xff0c;基于JavaScript实现&#xff0c;主要用于在网页中嵌入动态二维地图。 官方网站&#xff1a; https://openlayers.org 中文官网&#xff1a; https://openlayers.vip 大家可以去参考学习…

WHAT - 缓存命中 Cache Hit 和缓存未命中 Cache Miss

文章目录 一、什么是缓存命中&#xff1f;二、前端开发要知道哪些缓存机制&#xff08;以及命中条件&#xff09;&#xff1f;1. 浏览器缓存&#xff08;主要针对静态资源&#xff09;常见的缓存位置关键 HTTP 头字段&#xff08;决定命中与否&#xff09; 2. 前端应用层缓存&a…

10 个可靠的 Android 文件传输应用程序

Android 文件传输是 Android 用户的常见需求。我们经常需要将文件从一台 Android 设备传输到 PC 或 Mac。但我们怎样才能做到这一点呢&#xff1f;俗话说&#xff0c;工欲善其事&#xff0c;必先利其器。因此&#xff0c;首先了解 10 个锋利的 Android 文件传输应用程序&#x…

AlphaEvolve:LLM驱动的算法进化革命与科学发现新范式

AlphaEvolve&#xff1a;LLM驱动的算法进化革命与科学发现新范式 本文聚焦Google DeepMind最新发布的AlphaEvolve&#xff0c;探讨其如何通过LLM与进化算法的结合&#xff0c;在数学难题突破、计算基础设施优化等领域实现革命性进展。从48次乘法优化44矩阵相乘到数据中心资源利…

Java大师成长计划之第24天:Spring生态与微服务架构之分布式配置与API网关

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4-turbo模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在微服务架构中&#xff0c;如何管理…

eSwitch manager 简介

eSwitch manager 的定义和作用 eSwitch manager 通常指的是能够配置和管理 eSwitch&#xff08;嵌入式交换机&#xff09;的实体或接口。在 NVIDIA/Mellanox 的网络架构中&#xff0c;Physical Function&#xff08;PF&#xff09;在 switchdev 模式下充当 eSwitch manager&am…

最新开源 TEN VAD 与 Turn Detection 让 Voice Agent 对话更拟人 | 社区来稿

关键词&#xff1a;对话式 AI | 语音智能体 | Voice Agent | VAD | 轮次检测 | 声网 | TEN GPT-4o 所展示对话式 AI 的新高度&#xff0c;正一步步把我们在电影《Her》中看到的 AI 语音体验变成现实。AI 的语音交互正在变得更丰富、更流畅、更易用&#xff0c;成为构建多模态智…

AI实践用例---日程规划(通用日程管理文件ICS)灵感踩坑日常

我是一位践行独立开发者之路的菜鸟开发者。 由于执行力较差,常常有很多想法但是很多时候没有去践行。 所以我有了让大模型为我生成日程安排的想法,这确实可以,很简单。只需要将你的想法告诉ai就行了。 例如: 发给AI的提示词: 我想你帮我对,嗯,未来的一年做一个嗯,大…

大疆无人机​​DRC 链路

在大疆上云API中&#xff0c;​​DRC 链路​​通常指 ​​Device-Cloud Remote Control Link&#xff08;设备-云端远程控制链路&#xff09;​​&#xff0c;它是无人机&#xff08;或设备&#xff09;与云端服务之间建立的​​实时控制与数据传输通道​​&#xff0c;用于实现…

tomcat一闪而过,按任意键继续以及控制台中文乱码问题

问题描述 今天在打开tomcat,启动startup.bat程序时 tomcat直接闪退,后面查找资料后发现,可以通过编辑startup.bat文件内容,在最后一行加入pause即可让程序不会因为异常而终止退出 这样方便查看tomcat所爆出的错误: 然后,我明确看到我的tomcat启动程序显示如下的内容,没有明确…

中大型水闸安全监测系统解决方案

一、方案概述 中大型水闸作为水利工程的重要组成部分&#xff0c;承担着调节水位、控制水流、防洪排涝等多重功能&#xff0c;在防洪减灾、水资源配置、生态环境改善等方面发挥着巨大作用。然而&#xff0c;由于历史原因&#xff0c;许多水闸存在建设标准偏低、质量较差、配套设…

轨迹误差评估完整流程总结(使用 evo 工具)

roslaunch .launch rosbag play your_dataset.bag -r 2.0 ✅ 第二步&#xff1a;录制估计轨迹 bash 复制编辑 rosbag record -O traj_only.bag /aft_mapped_to_init 运行一段时间后 CtrlC 停止&#xff0c;生成 traj_only.bag 第三步&#xff1a;提取估计轨迹和真值轨迹为…

Linux任务管理与守护进程

目录 任务管理 jobs&#xff0c;fg&#xff0c;bg 进程组概念 任务概念 守护进程 守护进程的概念 守护进程的查看 守护进程的创建 ​编辑模拟实现daemon函数 任务管理 每当有一个用户登录Linux时&#xff0c;系统就会创建一个会话&#xff08;session&#xff09; 任何…

Json rpc 2.0比起传统Json在通信中的优势

JSON-RPC 2.0 相较于直接使用传统 JSON 进行通信&#xff0c;在协议规范性、开发效率、通信性能等方面具有显著优势。以下是核心差异点及技术价值分析&#xff1a; 一、结构化通信协议&#xff0c;降低开发成本 传统 JSON 通信需要开发者自定义数据结构和处理逻辑&#xff0c;…

机器学习与人工智能:NLP分词与文本相似度分析

DIY AI & ML NLP — Tokenization & Text Similarity by Jacob Ingle in Data Science Collective 本文所使用的数据是在 Creative Commons license 下提供的。尽管我们已尽力确保信息的准确性和完整性&#xff0c;但我们不对数据的完整性或可靠性做任何保证。数据的使…