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

ParameterizedType

好的,我来用最通俗易懂的方式解释 ParameterizedType

一句话理解

ParameterizedType 就是 Java 的"后悔药",能找回被"类型擦除"弄丢的泛型信息。


一个超简单的例子:水果篮子

想象你有几个篮子:

// 普通篮子 - 什么都能放,但很混乱
Basket basket1 = new Basket(); // 可能放水果,也可能放石头// 泛型篮子 - 标明用途的篮子
Basket<String> fruitBasket = new Basket<>(); // 专门放水果的篮子
Basket<Integer> numberBasket = new Basket<>(); // 专门放数字的篮子

问题来了:“类型擦除”

Java 为了兼容老版本,在程序运行时会把泛型信息擦除

  • 编译时:编译器知道 fruitBasket 是放水果的,numberBasket 是放数字的
  • 运行时:JVM 看到的都是普通的 Basket,分不清哪个是放什么的

这就好比:

  • 写标签时:你在篮子上贴了"水果专用"、“数字专用”
  • 实际用时:有人把标签都撕了,所有篮子看起来一模一样

ParameterizedType 的作用

ParameterizedType 就是那个能帮你找回被撕掉标签的工具!

什么时候标签没被完全撕掉?

在类的成员变量声明处,泛型信息会被保留:

public class MyClass {// 这里的泛型信息会被保留!ParameterizedType 就能看到private List<String> names;        // 我知道这是放String的List!private Map<String, Integer> scores; // 我知道这是String->Integer的Map!
}

实际代码演示

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;public class MyClass {// 这些字段的泛型信息会被保留private List<String> names;private Map<String, Integer> scores;private List<List<String>> nestedList; // 甚至嵌套的泛型也能看到!public static void main(String[] args) throws Exception {// 查看 names 字段的泛型信息Field namesField = MyClass.class.getDeclaredField("names");// 普通看法:只能看到是个List,不知道里面放什么System.out.println("普通看法: " + namesField.getType()); // 输出: interface java.util.List (只知道是篮子,不知道放什么)// 用ParameterizedType看:能看到详细信息!Type genericType = namesField.getGenericType();System.out.println("详细看法: " + genericType);// 输出: java.util.List<java.lang.String> (知道是放String的篮子!)if (genericType instanceof ParameterizedType) {ParameterizedType pType = (ParameterizedType) genericType;// 1. 问:篮子本身是什么?System.out.println("篮子类型: " + pType.getRawType()); // 输出: interface java.util.List// 2. 问:篮子里规定放什么?Type[] typeArgs = pType.getActualTypeArguments();System.out.println("规定内容: " + typeArgs[0]); // 输出: class java.lang.String}System.out.println("---");// 查看嵌套泛型 nestedListField nestedField = MyClass.class.getDeclaredField("nestedList");Type nestedType = nestedField.getGenericType();System.out.println("嵌套泛型: " + nestedType);// 输出: java.util.List<java.util.List<java.lang.String>>}
}

运行结果:

普通看法: interface java.util.List
详细看法: java.util.List<java.lang.String>
篮子类型: interface java.util.List
规定内容: class java.lang.String
---
嵌套泛型: java.util.List<java.util.List<java.lang.String>>

实际应用场景

场景1:JSON解析(最常用)

// 没有ParameterizedType:
String json = "[\"苹果\", \"香蕉\"]";
List list = gson.fromJson(json, List.class); 
// Gson懵逼:我知道这是个List,但里面该转成String?Integer?User对象?// 有ParameterizedType:
Type listType = new TypeToken<List<String>>(){}.getType();
List<String> fruits = gson.fromJson(json, listType);
// Gson开心:哦!原来是转成String的List,我知道了!

场景2:数据转换

框架需要知道你的 List 里到底要装什么类型的对象,才能正确创建实例、转换数据。


核心方法总结

ParameterizedType 主要有三个方法:

  1. getRawType() - 问:“篮子本身是什么?”

    • 回答:List.classMap.class
  2. getActualTypeArguments() - 问:“篮子里规定放什么?”

    • 回答:[String.class][String.class, Integer.class]
  3. getOwnerType() - 问:“这个篮子属于哪个大篮子?”(用得较少)
    在这里插入图片描述


总结

概念通俗解释例子
泛型给篮子贴标签,规定放什么List<String>
类型擦除运行时标签被撕掉所有 List 看起来都一样
ParameterizedType找回被撕标签的工具能发现 names 字段是 List<String>
为什么重要没有它,框架不知道你的容器里要装什么JSON解析、依赖注入等都依赖它

简单记:ParameterizedType = 泛型信息的"时光机",能回到编译时看看当初的类型约定!

http://www.dtcms.com/a/585393.html

相关文章:

  • 订单流战争:AI、区块链与市场透明度的终极博弈
  • 阿里内推-11月新出HC
  • 使用讯飞星火 Spark X1-32K 打造本地知识助手
  • 学习笔记7
  • 广西水利工程建设管理网站网站建设项目费用报价
  • Rust 练习册 :Phone Number与电话号码处理
  • CUDA C++编程指南(3.2.5)——分布式共享内存
  • 华为路由器核心技术详解:数据包的智能导航系统
  • Go基础:字符串常用的系统函数及对应案例详解
  • redis查询速度快的原因?
  • 社区类网站开发网站怎么提升流量
  • 注册网站时手机号格式不正确容易做的html5的网站
  • 如何查询哪些服务器 IP 访问了 Google Cloud 的 Vertex AI API
  • DataWhale-HelloAgents(第一部分:智能体与语言模型基础)
  • Ollama:在本地运行大语言模型的利器
  • 构建智能知识库问答助手:LangChain与大语言模型的深度融合实践
  • 大语言模型如何获得符号逻辑演绎能力?从频率范式到贝叶斯范式的转移
  • 网站建设中的功能新浪微博图床wordpress
  • 【玩泰山派】9、ubuntu22.04安装中文输入法
  • Spring IOC/DI 与 MVC 从入门到实战
  • SCNet超算平台DCU异构环境的Ollama启动服务后无法转发公网的问题解决
  • macOS下如何全文检索epub格式文件?
  • 一键配置 macOS 终极终端:iTerm2 + Oh My Zsh 自动化安装脚本
  • 如何在 Mac、Ubuntu、CentOS、Windows 上安装 MySQL 客户端
  • 石景山广州网站建设外贸soho建站多少钱
  • 某观鸟记录中心的爬虫——mitmproxy的简单使用
  • 58同城上海网站建设北京朝阳区房价
  • 金融网络销售怎么找客源公司网站做优化少钱
  • 代码随想录 Q84.分发饼干
  • 11.8 脚本网页 打砖块max