什么是java泛型(Type Erasure)
如果不用泛型而使用Object类型那么每次执行完之后我们即使得到这个结果还得类型转换一下那么就很容易出现类型转换异常泛型的出现避免了进行类型转换。泛型的使用例如public class GenericClassT {}中的T便是泛型java是强类型语言使用泛型时需要显式声明泛型T的类型例如创建对象new GenericClassString或者例如泛型方法public T void genericMethod(T a){Log.d(harvic,genericMethod: a.toString());}泛型方法中T用于声明独立的参数类型表示方法参数中的T是独立的而不是GenericClassT中的T。class GenericClassT { // 类级泛型 Tpublic T void genericMethod(T param) { // 方法级泛型 T遮蔽类级T// 此处的 T 与类级 T 无关}}在使用时应该这样调用genericClass.IntegergenericMethod(new Integer(123));其实中间的Integer也可以不写即隐式传递让编译器自己推断T的类型但是显示声明是一种更标准的写法。参考Java泛型详解T和ClassT的使用。泛型类泛型方法的详细使用实例 - 星朝 - 博客园泛型之类型擦除Java 的泛型是编译期特性例如ListInteger编译前会检查添加的元素是否为提供的泛型类型Integer在运行前会进行类型擦除Type Erasure无论是ListInteger还是ListString其泛型的类型都会被擦除成为Object即运行时集合的类型为ListObject我们可以通过反射来向ListInteger中添加String元素来绕开编译检查。ArrayListIntegerlistnewArrayListInteger();list.add(1);//这样调用add方法只能存储整形因为泛型类型的实例为IntegerInteger alist.get(0);// String a list.get(0); 会报错list.getClass().getMethod(add,Object.class).invoke(list,asd);Object objlist.get(0);//允许因为所有类都是Object的子类String s (String)obj;既然最终类型擦除为了Object为何取出元素时可以用Integer接收而不能用String接收呢实际上在编译后编译器会在list.get(0)左侧插入(Integer)来强转如果用Object a来接收则直接接收不会隐式强转另外list.get(0)这个元素的对象的类型仍然是Integer类型的用Object a接收时只是声明了一个Object类型的引用变量指向list.get(0)这个Integer对象实际上所谓的擦除强转并没有真的将Integer对象转成了Object而是将对象的Integer类型的引用转成了Object类型的引用。而String类型的引用无法指向Integer对象是因为引用变量的类型必须是右侧对象类型的父类有这样的规则父类引用指向子类对象向上转型自动完成子类引用不能指向父类对象不能向下转型或者引用类型和对象类型之间没有继承关系也不能指向但是父类引用指向子类对象时此父类引用可强转为子类引用。参考Java泛型中的类型擦除详解 - 知乎为何要进行类型擦除简而言之为了让旧版本的java项目代码可以在不修改项目代码的情况下无缝升级到新版本java。例如使用老版本java不支持泛型的项目代码是这样的Node node new Node();泛型版本是这样的NodeString node new NodeString();如图这样老版本代码Node node new Node();即使不加泛型信息也会和Node node new NodeString();一样最终被替换为Node node new Node();这样就可在不改老版本java代码的情况下利用编译器实现伪泛型。参考为什么Java的泛型要用擦除实现 - 简书参考中举例的ArrayList并不合适ArrayList毕竟是jdk自带的包不会存在左边声明的ArrayList和右边new的ArrayList不是同一个类的情况而且即使自定义类加载器实现加载同包同名的两个类也是不同的类是不能互相引用赋值的。所谓泛型擦除实际就是为了兼容老版本的写法那为何不将老版本的无泛型写法和新版本的泛型写法都编译为真泛型类实现真正的泛型呢因为泛型擦除后JVM处理的就是原生类无需改动JVM源码而如果都编译为真泛型类那么就需要对JVM额外引入泛型类要改动JVM源码这改动较大不如在编译期将泛型擦除为原生类来的更快。为何匿名内部类可获取泛型类型信息匿名内部类实际上是一个继承了父类的子类或是一个实现了接口的实现类会单独生成一个类文件父类/接口 和匿名内部类的泛型类型变量实际上还是被擦除成了Object但是匿名内部类会在自己类文件的签名中保留父类泛型的实际类型参数信息例如ListString中String就是实际类型参数。注意是匿名内部类的.class类文件中保留了父类泛型的实际类型参数信息而匿名内部类的对象中的泛型信息依然是被擦除了。而泛型类本身的类文件自然是不会有实际类型参数信息的因为泛型类被那么多的地方引用如果保留实际类型参数信息便会冲突失去了其“泛”的功能。例如Flink 使用 匿名内部类Anonymous Inner Class 来保留父类泛型的实际类型参数信息并通过反射机制提取它。匿名子类会在其类文件的元数据中保留父类泛型的实际类型参数信息如OutputTagJsonNode参考Flink OutputTag 为什么需要加 {} - chouc - 博客园扩展匿名内部类靠继承指定了类型参数的父类来保留实际类型参数信息那么普通子类继承一个具体类型的泛型类也能保留实际类型参数信息此类型信息也保留在子类的类文件签名中可通过反射获取。应当说匿名内部类保留实际类型参数信息也是依靠“子类保留父类实际类型参数信息”这一原理只不过匿名内部类是一种更简单的继承写法。什么是匿名内部类参考JAVA匿名内部类(Anonymous Classes) - 无恨之都 - 博客园泛型 T 和 ? 的区别ListT这个“T”是一个形参可以理解为一个占位符被使用时会在程序运行的时候替换成具体的类型比如替换成StringInteger之类的。List?这个“?”是一个实参这是Java定义的一种特殊类型比Object更特殊是一个用于匹配所有类型的通配符而不是一个占位符。比如ListObject和ListString是没有父子关系的这是两个类型——ListObject类型和ListString类型但是List? 是ListString的父类。用extends限定类型子集的时候不能多重继承T 可以使用super限定父集的时候 可以 T 不可以。我的理解List?可以匹配ListString、ListInteger、ListLong......而ListT中的T是一个类型变量假设给一个方法传入一个ListString方法参数声明为ListT代表需要手动传入一个类型T这个T此时为String而方法参数声明为List?代表直接匹配了传入的ListString就好比直接在方法参数上声明了一个ListString来匹配因此说T为形参而?为实参。也因此二者使用地方不同T可作为声明类的类型参数、方法参数而?只能作为声明变量方法参数变量、成员变量的类型字段或局部变量的类型字段即Object? a的类型参数。参考Java泛型通配符 ? 与 T 的区别 - 沙湖王 - SegmentFault 思否Java 泛型 TEKV?傻傻分不清-腾讯云开发者社区-腾讯云泛型上下界的含义泛型上限? extends T 表示泛型的上界通配符适用于频繁获取数据的场景。它限制了泛型类型只能是指定类型或其子类。例如List? extends Fruit fruits new ArrayListApple();在这个例子中fruits可以是Fruit或Fruit任何子类的列表如ListApple。这里“?”是一个具体的未知类型且是Fruit的子类向列表中添加元素相当于将其中的某一个“?”类型的元素引用赋值为Apple对象又根据前面说的“父类引用指向子类对象子类引用不能指向父类对象”而此“?”类型不是Apple类型的父类而是与Apple同属于Fruit的子类所以不能向这个列表中添加任何元素要添加也只能添加null只能从中获取元素。总结List? extends Fruit fruits可赋值为ListFruit及其子类列表但不能向其中添加任何元素。泛型下限? super T 表示泛型的下界通配符适用于频繁添加数据的场景。它限制了泛型类型只能是指定类型或其父类。例如List? super Apple apples new ArrayListFruit();在这个例子中apples可以是Apple或Apple任何父类的列表如ListFruit。这里“?”是一个具体的未知类型且是Apple的父类向列表中添加元素相当于将其中的某一个“?”类型的元素引用赋值为Fruit对象又根据前面说的“父类引用指向子类对象子类引用不能指向父类对象”而此“?”类型是Apple类型的父类你可以向这个列表中添加Apple或Apple子类的对象但因为“?”是未知类型从中获取的元素只能用Object类型接收可强转为原本类型。总结List? super Apple apples可赋值为ListApple及其父类列表可向其中添加Apple或Apple子类元素取元素要用Object类型接收。

相关新闻

Agent面试详解(上):从模型接口到可恢复的运行时

Agent面试详解(上):从模型接口到可恢复的运行时

《Agent面试详解》系列:上篇:运行时与上下文 中篇:记忆、工具与并发(待发布) 下篇:评测、安全与落地(待发布) 最近刷到几段讨论 DeepSeek Agent 岗位和面试的视频。里面反复出现的…

2026/9/29 20:31:59 阅读更多 →
智慧文旅与景区慢直播|数字化赋能,视频直播点播平台EasyDSS一体化视频能力激活文旅传播新势能

智慧文旅与景区慢直播|数字化赋能,视频直播点播平台EasyDSS一体化视频能力激活文旅传播新势能

当下智慧文旅建设已成趋势,但多数景区、文博机构、文旅企业的直播运营普遍存在痛点:直播画面卡顿掉帧、并发承载不足、内容版权无保护、无法24小时常态化直播、活动数据无统计、无法对接自有平台,导致文旅宣传效果差、流量无法沉淀、品牌传播…

2026/9/28 2:26:20 阅读更多 →
软路由小白必看:如何用闲置电脑5分钟搭建OpenWrt系统(附详细图文)

软路由小白必看:如何用闲置电脑5分钟搭建OpenWrt系统(附详细图文)

软路由新手指南:用闲置电脑打造你的专属网络中枢 手边是不是总有一台旧电脑,食之无味,弃之可惜?与其让它躺在角落吃灰,不如赋予它新的使命。今天,我们就来聊聊如何将这台“退役”的电脑,变身为一个功能强大、可玩性极高的家庭网络核心——软路由。整个过程,从准备到点…

2026/9/30 3:50:46 阅读更多 →

最新新闻

含泪总结veyon的编译,Veyon-4.11-2+VMware 17+ubuntu26.04+cmake+qt5.15用 kimi不要用豆包和deepseek这两个大傻子。

含泪总结veyon的编译,Veyon-4.11-2+VMware 17+ubuntu26.04+cmake+qt5.15用 kimi不要用豆包和deepseek这两个大傻子。

在windows解决不了的问题在linux就能解决: 1.windowqt,得自己去找三方库,添加,编译。各种环境配置,还有软件版本问题。 2.linux有一个包管理器,就像万事通魔镜,只要一行代码就能解决以上所有问题…

2026/9/30 15:29:08 阅读更多 →
跨境电商主要模式是什么意思?2026 小白扫盲指南

跨境电商主要模式是什么意思?2026 小白扫盲指南

摘要:跨境电商主要模式是什么意思?简单说,就是跨境电商中「货从哪来、卖给谁、运营谁来扛」的四种基本方式。本文用大白话讲清概念、演变与判断维度。 跨境电商主要模式是什么意思?不少刚接触出海的人被 B2C、D2C、F2C、B2B 这些…

2026/9/30 15:29:08 阅读更多 →
华为S5700/S6700交换机iStack堆叠配置与排错实战

华为S5700/S6700交换机iStack堆叠配置与排错实战

你接手过几台华为交换机,想做成双机堆叠,又不太确定从哪儿下手?或者你已经按手册敲过一圈命令,结果发现堆叠状态没起来、成员口误报、版本不匹配,一头雾水。这篇就按我实际配置 S5700/S6700 系列盒式交换机的经验&…

2026/9/30 15:29:08 阅读更多 →
合作型Stackelberg博弈微网调度:Matlab+Cplex双层优化实践

合作型Stackelberg博弈微网调度:Matlab+Cplex双层优化实践

前段时间我把一套“基于合作型Stackelberg博弈的微网运行策略”完整跑通了,用的就是Matlab调度框架加Cplex求解器。这套方案在电力系统方向的研究和工程预研里出现频率非常高,但绝大多数资料只讲数学推导,真正能直接落到代码层面的教程很少。…

2026/9/30 15:29:08 阅读更多 →
设计师如何跟上AI节奏?三阶接入法打造人机协同工作流

设计师如何跟上AI节奏?三阶接入法打造人机协同工作流

AI不是洪水,也不该是神灯。这半年我身边越来越多的设计师朋友开始焦虑:今天Midjourney能出图,明天Figma接了大模型,后天连PPT都能一键生成。整个行业像被按了快进键,稍不留神就觉得自己跟不上了。但我的判断恰恰相反—…

2026/9/30 15:29:08 阅读更多 →
密钥格式化多语言实现:Java/JS/Python字符串处理与边界避坑

密钥格式化多语言实现:Java/JS/Python字符串处理与边界避坑

最近刷题群里聊到一个挺经典的字符串处理题:密钥格式化。要求是给定一个只包含字母数字和连字符的字符串 S,以及一个整数 K,把所有连字符删掉,再把字母统一转成大写,最后按 K 个字符一组用连字符重新连接,第…

2026/9/30 15:28:08 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/30 15:27:04 阅读更多 →