首页/新闻资讯/正文详情

Java 包装类、泛型与类型擦除

发布时间:2026/9/27 9:38:07 来源:云帆数科 栏目:资讯中心
Java 包装类、泛型与类型擦除
文章目录1. 包装类1.1 基本数据类型和其对应的包装类1.2 装箱与拆箱1.3 Integer 缓存机制2.泛型2.1 使用语法2.2 泛型的”本质机制“2.2.1 泛型只存在编译期2.2.2 类型擦除2.3 泛型的上界1. 包装类1.1 基本数据类型和其对应的包装类Java 为了把基本数据类型当作“对象”来使用专门提供的一组类。基本类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean1.2 装箱与拆箱装箱装包把基本数据类型变成包装类类型的过程叫做装箱装包。装箱又分为自动装箱和手动装箱实际自动装箱底层逻辑还是手动装箱publicclassDemo{publicstaticvoidmain(String[]args){inta100;//手动装箱IntegeriaInteger.valueOf(a);DoubledaDouble.valueOf(a);System.out.println(ia);System.out.println(da);//自动装箱Integeriiaa;Doubledda(double)a;System.out.println(iia);System.out.println(dda);}}拆箱拆包把包装类类型变成基本数据类型的过程就叫做拆箱拆包。拆箱也分为自动拆箱和手动拆箱实际自动拆箱底层逻辑还是手动拆箱publicclassDemo{publicstaticvoidmain(String[]args){Integeria100;//手动拆箱intaia.intValue();doubledia.doubleValue();System.out.println(a);System.out.println(d);//自动拆箱intiiaia;doubledaia.doubleValue();System.out.println(iia);System.out.println(da);}}1.3 Integer 缓存机制publicclassDemo{publicstaticvoidmain(String[]args){Integera100;Integerb100;System.out.println(ab);//trueIntegerc200;Integerd200;System.out.println(cd);//false}}以上代码中涉及的是自动装包结果的原因Integer.valueOf()会缓存 [-128,127]在这个范围内返回同一个对象超出范围新对象我们可以查看 Integer 源码中的valueOf()方法我们可以看出自动装包输入的 i 在其中是个数组的范围我们可以查看到 IntegerCache 这样一个类中设定了low -128,而high最终被h 127所赋予因此得到该缓存数组范围[-128,127]我们再思考返回的数组内容IntegerCache.cache[i (-IntegerCache.low)]我们就拿i 100代入而我们通常比较“值”的方法是使用a.equals(b)2.泛型泛型就是把“类型”当作参数在编译期确定下来的一种机制。其作用是 1、解决“类型不安全”问题2、消除强制类型转换向下转型3、提高代码复用能力2.1 使用语法泛型类列举样例class泛型类名称{//可使用类型参数}classClassNameT1,T2,...,Tn{}class泛型类名称类型形参列表extends继承类/*此处可使用类型参数*/{}classClassNameT1,T2,...,TnextendsParentClassT1{}举例classBoxT{privateTvalue;publicvoidset(Tvalue){this.valuevalue;}publicTget(){returnvalue;}}使用如下BoxStringboxnewBox();box.set(hello);Stringsbox.get();说明T在定义类时只是占位在创建对象时才是真正确定类型泛型方法方法限定符类型形参列表返回值类型 方法名称(形参列表){...}publicstaticTTgetFirst(T[]arr){returnarr[0];}解释T位于返回值之前表示该方法定义了一个泛型类型参数TT表示这个方法返回值的类型是T使用如下IntegerigetFirst(newInteger[]{1,2});StringsgetFirst(newString[]{a,b});泛型接口interfaceMapperT{Tmap(Tinput);}实现方式一实现时确定类型classStringMapperimplementsMapperString{publicStringmap(Stringinput){returninput.toUpperCase();}}实现方式二实现时仍保留泛型classDefaultMapperTimplementsMapperT{publicTmap(Tinput){returninput;}}2.2 泛型的”本质机制“2.2.1 泛型只存在编译期Java 的泛型是”伪泛型“比如ArrayListStringArrayListInteger在 JVM 看来都是ArrayList2.2.2 类型擦除编译过程中将所有的 T 替换为 Object 这种机制称为擦除机制java 的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。ArrayListStringlistnewArrayList();编译后等价于ArrayListlistnewArrayList();只是编译器偷偷加了强制类型检查和转换。因此对于两个问题1、那为什么T[] ts new T[5];是不对的编译的时候替换为Object不是相当于Object[] ts new Object[5]吗2、类型擦除一定是把T变成Object吗问题 一首先 java 编译器不允许这样写原因不是语法而是在于类型安全。因为数组是运行期类型检查的数组在运行期知道自己真实的元素类型。另外泛型是编译期类型检查的在运行期就已经被删除了所以 JVM 运行期并不知道元素类型举例假如T[] ts new T[5];允许classBoxT{T[]tsnewT[5];// 假设合法}BoxStringboxnewBox();Object[]arrbox.ts;// 数组协变合法arr[0]100;// 编译通过首先arr是Object[]放Integer是合理的但box.ts逻辑上应该是String[]而且编译器也完全无法阻止这个错误对于问题二不一定。无边界泛型 - 擦除成 Object因为没有任何约束最安全的上界就是Object如果有上界泛型 - 擦除成”上界类型“方法级的泛型同理举例如下publicTextendsComparableTTmax(Ta,Tb){returna.compareTo(b)0?a:b;}擦除后publicComparablemax(Comparablea,Comparableb){returna.compareTo(b)0?a:b;}另外对于类型擦除还有许多可以了解的地方1.泛型信息不会进入 JVM 的方法签名中也就是说不存在重载2.数组协变泛型不变2.3 泛型的上界泛型上界限制泛型参数”最多能是什么类型“并向编译器承诺他至少具备某个父类或接口的能力。使用语法class泛型类名称类型参数extends类型边界{}这里的extends既表示继承也表示实现接口。举个例子classBoxTextendsNumber{Tvalue;voidprint(){value.intValue();}}如果没有extends Number那么编译器只知道T是ObjectObject没有intValue().但是加上之后就相当于上界告诉了编译器T至少是NumberNumber定义了intValue()以上是我关于Java的笔记分享感谢你读到这里这也是我学习路上的一个小小记录。希望以后回头看时能看到自己的成长~

相关推荐

ng-zorro-antd 小型进度条(nz-progress nzSize=“small“)完整使用指南:窄区域场景的尺寸适配与源码原理
ng-zorro-antd 小型进度条(nz-progress nzSize=“small“)完整使用指南:窄区域场景的尺寸适配与源码原理

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 导读 本文围绕 ng-zorro-antd(Angular 版 Ant Design)Progr… · 2026/9/27 9:38:01

Agent-Lightning强化学习框架研究
Agent-Lightning强化学习框架研究

开启智能体自我进化的新纪元 Agent Lightning 通过检测智能体交互、收集遥测数据并应用学习算法来改进智能体行为,从而以最小的代码更改实现 AI 智能体的优化。该系统支持多种智能体框架(LangChain、OpenAI Agent SDK、AutoGen、CrewAI、Anthropic&#… · 2026/9/27 9:38:01

西宁微信网站建设从零搭建避坑指南
西宁微信网站建设从零搭建避坑指南

西宁微信网站建设从零搭建避坑指南 域名解析报错404,服务器IP连不上,SSL证书配置后浏览器还是红叉。西宁这边做企业站的朋友,是不是常被这几个问题搞得头大?很多老板以为买个服务器、注册个域名就能搞定,结果卡在技术细节上,项目拖了三个月还没… · 2026/9/27 9:37:55

wordpress主题innmx实测3坑:被黑后如何用代码加固
wordpress主题innmx实测3坑:被黑后如何用代码加固

wordpress主题innmx实测3坑:被黑后如何用代码加固 网站被黑挂马后,很多项目经理第一反应是删库重装,但往往忽略了底层代码的脆弱性。近期对 wordpress主题innmx 进行深度 对比评测… · 2026/9/27 10:22:59

Spring 框架核心详解:IOC、DI
Spring 框架核心详解:IOC、DI

温馨提示:学习所需要的jar文件,下载链接如下: 通过网盘分享的文件:lib 链接: SSMjar包下载链接 Spring 框架核心详解:IOC、DI 1. IOC(控制反转) 1.1 概念与原理1.2 容器实现对比1.3 代码案例&a… · 2026/9/27 10:22:53

做网站流程优帮云:3步搞定域名服务器配置与免费工具实战
做网站流程优帮云:3步搞定域名服务器配置与免费工具实战

做网站流程优帮云:3步搞定域名服务器配置与免费工具实战 域名解析报错、服务器 IP 找不到、SSL 证书装不上……是不是每次搞这堆东西头都大?很多甲方对接人最头疼的就是这块,明明网站做好了,上线却卡在基础设施上。其实, 做网站流程优帮云… · 2026/9/27 10:22:53

STM32接红外PM2.5传感器实战:原理、接线、滤波与标定全解析
STM32接红外PM2.5传感器实战:原理、接线、滤波与标定全解析

把STM32和红外PM2.5传感器接在一起,是很多做环境监测、空气净化器、毕业设计或者个人DIY项目时绕不开的一步。市面上常见的红外式粉尘传感器模块,比如夏普GP2Y1010AU0F,本质上是“模拟电压输出”,读起来并不复杂,但真正… · 2026/9/27 10:22:47

godday网站建设新手从零搭建避坑指南
godday网站建设新手从零搭建避坑指南

godday网站建设新手从零搭建避坑指南 昨晚三点,盯着后台满屏红色的“网站被黑挂马”警报,那种绝望感谁懂?辛辛苦苦搞了半年的 godday… · 2026/9/27 10:22:47

WASM不能直接操作ESP32硬件?虚拟机边界与架构设计
WASM不能直接操作ESP32硬件?虚拟机边界与架构设计

最近有个项目把 ESP32 当边缘计算节点,用 WASM(WebAssembly)承载用户可热更新的算法模块,跑的是 WAMR 虚拟机。方案刚出来的同事提出一个需求:能不能让 WASM 应用直接操作 GPIO 和 UART,这样就不用来回调我… · 2026/9/27 10:22:47

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码