【包装类简单认识泛型】

news2024/12/24 9:03:13

目录

1,包装类

1.1 基本数据类型和对应的包装类

1.2 装箱和拆箱

2,什么是泛型

3,引出泛型

3.1 语法

4,泛型如何编译的

4.1 擦除机制

4.2 为什么不能实例化泛型类型数组

5,泛型的上界

5.1 语法

5.2 复杂示例

6,泛型方法


1,包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。

1.1 基本数据类型和对应的包装类

除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。

1.2 装箱和拆箱

装箱:把一个基本类型变成引用类型

这里划红线的原因是代表当前方法已经过时

不管是显示还是隐式,我们打开底层的汇编过程

发现自动装箱在底层也是调用的valueof,总的来说,valueof在给我们进行装箱

拆箱:把一个引用类型变成基本类型

进入底层查看汇编代码

还可以将其变成double类型

【面试题】

下列代码输出什么,为什么?

这里涉及到点是装箱,上面讲到过装箱在底层是调用的valueof来完成的,进入到valueof的源码

valueof调用了这个方法,发现i在if这个条件范围里面,就去cache这个数组里面取值,相反如果i不在这个范围里面,那么就会实例化一个新的对象,即根据上面代码的运行结果发现100在if条件范围里面,200实例化了一个新的对象,对应地址不同,所以范围false

进入high的源码:

观察发现这个数组的范围是[-127,128],即i的值在这个范围里面,就在这个数组里面取值,反之实例化新的对象

2,什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。

泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。(传类型)

3,引出泛型

把类型参数化,意味着可以传指定的类型参数—》如何实现呢?

首先想到的是:Object

需求:实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值

也就是说getValue的返回值是Object,他是一个父类类型,所以得强制类型转换

但是这种写法显得代码很乱,里面即可以存放int,又能存放String,甚至还可以存放double,而且还要进行强转,貌似是一个通用的,其实并不通用。

期望的是存指定类型数据,把参数传给Myarray

所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

3.1 语法

在<>里面可写E/T/E,T     <T>代表当前类,是一个泛型类

上面代码就可以改动:

1,在实例化对象的时候已经指定当前类型为整型,每次存储数据的时候,会检查你存入的数据是不是和你指定的类型一样,若不一样,就会报错。(编译的时候)

2,此时不需要进行强制类型转换      运行的时候没有泛型这样的概念

并不是<T>替换成<Integer>,只是拿着它去检查的,并不是替换

那我们是否可以直接实例化T? 

是不可以的,Java当中的数组是一种类型,所以实例化数组的时候要知道实例化的是一个什么样的数组,从此代码来看,并不知道T是一个什么,所以上面的T并没有替换成Integer,只是拿着它去检查类型是否匹配!!!

这样写也是存在问题的,下面会讲到

代码解释:

1. 类名后的代表占位符,表示当前类是一个泛型类

2. 不能new泛型类型的数组

3. 类型后加入指定当前类型

4. 不需要进行强制类型转换

5. 编译器会在存放元素的时 候帮助我们进行类型检查

注意:泛型只能接受类,所有的基本数据类型必须使用包装类!

4,泛型如何编译的

运行的时候代码在JVM当中,也就是说在JVM当中没有泛型的概念 

4.1 擦除机制

那么,泛型到底是怎么编译的?这个问题,也是曾经的一个面试问题。泛型本质是一个非常难的语法,要理解好他还是需要一定的时间打磨。

通过命令:javap -c 查看字节码文件,所有的T都是Object。

在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。

Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。

4.2 为什么不能实例化泛型类型数组

在上面讲到以下代码这种写法是有问题的

在MyArray里面添加一个方法

对此方法进行访问

这里报错了,类型转换异常,不能把Object转换成String类型的,getArray的返回值通过通过类型擦除是Object类型数组,Object类型数组给到String数组是不能给的,强转都不行

那为什么强转都不行呢?

我们说Object类是所以类的父类,但是Object[ ]不是所以数组的父类,他是一种单独的类型,所以就不能说Object[ ]是String[ ]的父类,Object是String的父类

所以就只能通过Object数组来接收

所以,以后都用Object来写

5,泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

5.1 语法

例如:

只接受 Number 的子类型作为 T 的类型实参,或者是Number自己

5.2 复杂示例

比如:定义一个泛型类,找到数组当中的最大值

6,泛型方法

还可以不实例化对象,将方法改写成静态方法,使用类名去调用即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1714855.html

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

相关文章

【数据结构】探索树中的奇妙世界

专栏介绍&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累…

521源码-免费源码下载-免费学习网站教程-宝塔面板ssl网站证书到期后弹出无法续期错误提示

宝塔面板如果从老版本升级到8.10后&#xff0c;当点站证书过期续期时会弹出错误&#xff1a; 排查文件是找不到问题出在哪里&#xff0c;导致续期错误。 解决办法&#xff1a;通过摸索&#xff0c;最简单的就是删除站点&#xff0c;注意&#xff1a;只是删除&#xff0c;不是把…

【Text2SQL 论文】评估 ChatGPT 的 zero-shot Text2SQL 能力

论文&#xff1a;A comprehensive evaluation of ChatGPT’s zero-shot Text-to-SQL capability ⭐⭐⭐⭐ arXiv:2303.13547 这篇论文呢综合评估了 ChatGPT 在 zero-shot Text2SQL 任务上的表现。 dataset 使用了 Spider、Spider-SYN、Spider-DK、Spider-Realistic、Spider-CG…

三步问题 | 动态规划

1.三步问题 题目连接&#xff1a;面试题 08.01. 三步问题 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有n阶台阶&#xff0c;小孩一次可以上1阶、2阶或3阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模1000000007。 2…

高并发项目-用户登录基本功能

文章目录 1.数据库表设计1.IDEA连接数据库2.修改application.yml中数据库的名称为seckill3.IDEA创建数据库seckill4.创建数据表 seckill_user5.密码加密分析1.传统方式&#xff08;不安全&#xff09;2.改进方式&#xff08;两次加密加盐&#xff09; 2.密码加密功能实现1.pom.…

5.29_Java程序流程控制

CSDN 同C语言的流程同 1、补充&#xff1a; 1、switch使用时的注意事项 1、表达式只能是byte、short、int、char&#xff0c;JDK5开始支持枚举&#xff0c;JDK7开始支持String、不支持double、float、long switch里面是做分支匹配&#xff0c;也就是可以出现很多分支&am…

【SPSS】基于因子分析法对水果茶调查问卷进行分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【Python】解决Python报错:TypeError: can only concatenate str (not “int“) to str

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

P2341 受欢迎的牛

题目描述 每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N 头牛&#xff0c;给你 M 对整数&#xff0c;表示牛 A 认为牛 B 受欢迎。这种关系是具有传递性的&#xff0c;如果 A 认为 B 受欢迎&#xff0c;B 认为 C 受欢迎&#xff0c;那么牛 A 也认为牛 C 受欢迎。你的任务是…

058.最后一个单词的长度

题意 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 难度 简单 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输…

开抖店必须要办理营业执照吗?不用营业执照开店的个人店能用吗?

大家好&#xff0c;我是电商花花。 可能大家都发现了&#xff0c;抖音小店个人店不用营业执照&#xff0c;只凭借身份证就能开店。 但是这个个人店花花并不建议大家去开&#xff0c;虽然说用用身份证也能开店&#xff0c;有效的帮我们减少了开店的成本&#xff0c;但是个人店…

2024 angstromCTF re 部分wp

Guess the Flag 附件拖入ida 比较简单&#xff0c;就一个异或 switcher 附件拖入ida 明文flag Polyomino 附件拖入ida 需要输入九个数&#xff0c;然后进入处理和判断&#xff0c;如果满足条件则进入输出flag部分&#xff0c;flag和输入有关&#xff0c;所以要理解需要满足什么…

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

GPT-4o:人工智能新纪元的开端

引言 近年来&#xff0c;人工智能领域的发展日新月异&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;各种生成预训练模型不断推陈出新。自OpenAI发布GPT-3以来&#xff0c;生成预训练模型在文本生成、语言理解等任务中展现了强大的能力。近期&a…

MVC和MVVM

MVC Model层&#xff1a;用于处理应用程序数据逻辑的部分&#xff0c;通常负责在数据库中存取数据 View&#xff08;视图&#xff09;处理数据显示的部分。通常视图是依据模型数据创建的 Controller&#xff08;控制器&#xff09;是处理用户交互的部分。通常控制器负责从视…

Orange Pi Kunpeng Pro测评

#创作灵感# 参加树莓派鲲鹏开发版的测评活动&#xff0c;也想体验一下该开发版&#xff0c;之前有做过树莓派和香橙派的开发&#xff0c;刚好借此机会了解一下鲲鹏&#xff0c;所以就有了这篇测评文章。 #正文# 引言 说是测评&#xff0c;其实也没有多少测评方面的内容&…

基于jeecgboot-vue3的Flowable新建流程定义(二)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节 4、编辑好后进行保存&#xff0c;保存代码如下&#xff1a; /*保存流程定义*/const save (data: any) > {//console.log("save data", data); // { process: {..…

装机必备——截图工具Snipaste安装教程

装机必备——截图工具Snipaste安装教程 软件下载 软件名称&#xff1a;Snipaste2.7 软件语言&#xff1a;简体中文 软件大小&#xff1a;15.37M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载通…

RAG 高级应用:基于 Nougat、HTML 转换与 GPT-4o 解析复杂 PDF 内嵌表格

一、前言 RAG&#xff08;检索增强生成&#xff09;应用最具挑战性的方面之一是如何处理复杂文档的内容&#xff0c;例如 PDF 文档中的图像和表格&#xff0c;因为这些内容不像传统文本那样容易解析和检索。前面我们有介绍过如何使用 LlamaIndex 提供的 LlamaParse 技术解析复…