【JAVA】java泛型 详解
java泛型 详解
- 一、参数化类型(Parameterized Type):
- 二. 泛型类(Generic Class):
- 三. 泛型方法(Generic Method):
- 四. 通配符类型(Wildcard Type):
- 五. 类型擦除(Type Erasure):
- 六. 自动装箱和拆箱(Autoboxing and Unboxing):
Java 泛型是一种在编写类、接口和方法时使用参数化类型的机制,它提供了更强大的类型安全性、代码重用性和可读性。下面详细介绍 Java 泛型的一些关键概念:
一、参数化类型(Parameterized Type):
参数化类型是一种在类、接口或方法中使用的类型,它可以接受一个或多个类型参数。例如,List<String> 是一个参数化类型,表示一个元素类型为字符串的列表。
二. 泛型类(Generic Class):
泛型类是具有一个或多个类型参数的类。类型参数可以在类的声明中使用,并在类的实例化时指定具体的类型。例如:
public class Box<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}
在上面的例子中,Box<T> 是一个泛型类,T 是类型参数。在创建 Box 类的实例时,可以指定具体的类型,例如 Box<Integer> 或 Box<String>。
三. 泛型方法(Generic Method):
泛型方法是具有一个或多个类型参数的方法。类型参数可以在方法的返回类型之前声明,并在方法调用时指定具体的类型。例如:
public <T> T getObject(T[] array, int index) {return array[index];
}
在上面的例子中,<T> 是类型参数,getObject 方法返回数组中指定索引的元素,且返回类型与数组元素类型相同。
四. 通配符类型(Wildcard Type):
通配符类型是一种特殊的泛型类型,用于表示不确定的类型。通配符类型有三种形式:<?>、<? extends T> 和 <? super T>。参考
【JAVA】泛型,泛型变量,通配符 <?> ,原理及应用详解
【JAVA】 ? super T 和 ? extends T的区别
例如:
<?> 表示任意类型。
<? extends T> 表示某个类的子类。
<? super T> 表示某个类的父类。
通配符类型通常用于方法参数或返回类型中,以提高灵活性。
五. 类型擦除(Type Erasure):
Java 泛型通过类型擦除实现,在编译时会将泛型类型转换为原始类型。这意味着在运行时,泛型类型的信息会被擦除,而泛型参数会被替换为其边界类型或 Object 类型。例如,List<String> 在运行时会被擦除为 List,而 T 会被替换为 Object。
这样做是为了确保泛型代码在运行时能够与之前的非泛型代码兼容,因为 Java 虚拟机(JVM)是在泛型被引入之前就存在的。
例如,考虑以下泛型类的定义:
public class Box<T> {private T value;public T getValue() {return value;}public void setValue(T value) {this.value = value;}
}
在类型擦除之后,编译器会将泛型类型 T 擦除为其边界类型或 Object 类型。因此,上述泛型类的擦除版本可能如下所示:
public class Box {private Object value;public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}
}
类型擦除的结果是,尽管在源代码中使用了泛型类型 T,但在编译后的字节码中,泛型类型信息会被擦除,使得所有类型参数都被替换为它们的擦除类型。这意味着在运行时,不再有关于泛型类型的具体信息可用,这种信息已经在编译时被擦除了。
尽管类型擦除在一定程度上降低了泛型的灵活性,但它确保了与之前版本的兼容性,并且使得泛型代码能够在不同版本的 Java 中正常运行。
六. 自动装箱和拆箱(Autoboxing and Unboxing):
Java 泛型支持自动装箱和拆箱,即自动将基本数据类型转换为相应的包装类(装箱),以及自动将包装类转换为基本数据类型(拆箱)。例如,自动装箱可以将 int 转换为 Integer,而自动拆箱可以将 Integer 转换为 int。主要有以下两个作用:
- 简化代码编写:自动装箱和拆箱使得在基本数据类型和其对应的包装类型之间转换变得更加方便。开发人员不再需要显式地调用
valueOf()和xxxValue()等转换方法,而是可以直接赋值或使用对象,编写更加简洁清晰的代码。 - 增加类型的灵活性:自动装箱和拆箱使得基本数据类型和包装类型之间的转换更加无缝,提高了类型的灵活性。例如,在集合类中,可以直接存储包装类型的对象,而无需手动将基本数据类型转换为包装类型。这使得代码编写更加灵活,可以更方便地处理不同类型的数据。
Java 泛型提供了一种强大的编程机制,可以提高代码的类型安全性、重用性和可读性。它允许开发人员编写通用的代码,以处理各种类型的数据,同时保持代码的简洁和清晰。
相关文章:
【JAVA】java泛型 详解
java泛型 详解 一、参数化类型(Parameterized Type):二. 泛型类(Generic Class):三. 泛型方法(Generic Method):四. 通配符类型(Wildcard Type)&a…...
基于RBAC的权限管理的理论实现和权限管理的实现
权限管理的理论 首先需要两个页面支持,分别是角色管理和员工管理,其中角色管理对应的是角色和权限的配合,员工管理则是将登录的员工账号和员工所处的角色进行对应,即通过新增角色这个概念,让权限和员工并不直接关联&a…...
Atcoder ABC340 C - Divide and Divide
Divide and Divide(分而治之) 时间限制:2s 内存限制:1024MB 【原题地址】 所有图片源自Atcoder,题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例…...
趣学贝叶斯统计:概率密度分布(probability density function)
目录 1. 分布:PDF与PMFPDFPMF 2. 将概率密度函数应用于我们的问题用积分量化连续分布积分度量变化率:导数 3. R语言实践4. 小结 1. 分布:PDF与PMF PDF PDF定义在连续值上。在连续型随机变量的情况下,具体取某个数值的概率是0,因此PDF并不直…...
伦敦金行情分析需要学习吗?
对于伦敦金交易来说,目前大致分成两派,一派是实干派,认为做伦敦金交易重要的是实战,不需要学习太多东西,否则容易被理论知识所局限。另一派则是强调学习,没有理论知识,投资者很难做好伦敦金交易…...
Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…...
服务器遭受 DDoS 攻击的常见迹象有哪些?
服务器遭受 DDoS 攻击的现象很常见,并且有时不容易预防,有部分原因是它们的形式多种多样,而且黑客手段越来越隐蔽。如果您怀疑自己可能遭受 DDoS 攻击,可以寻找多种迹象。以下是 DDoS 攻击的5个常见迹象: 1.网络流量无…...
【机器学习笔记】 15 机器学习项目流程
机器学习的一般步骤 数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。与问卷审核不同,录入后的数据清理一般是由计算机而不是人工完成。 探索性数据分析(EDA 探索性数据…...
【C语言】位操作符与移位操作符练习
目录 前言: 1.一道变态的面试题 2.输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。 方法一: 方法二: 方法三: 3.打印整数二进制的奇数位和偶数位 前言: 前篇我们学习过C语言…...
第十四届“中关村青联杯”全国研究生数学建模竞赛-A题:无人机在抢险救灾中的优化运用
目录 摘 要: 1 问题重述 1.1 问题背景 1.2 待解决的问题 2 模型假设及符号说明...
Android 9.0 Launcher3桌面显示多个相同app图标的解决办法
1.前言 在9.0的系统ROM定制化开发中,在Launcher3的系统原生桌面中,在显示桌面的时候,在禁用和启用app的功能测试的时候,会发现有多个相同app的图标显示在桌面 这对Launcher3的体验效果不是很好,所以为了优化产品,需要解决这个bug,然后让产品更完善 2.桌面显示多个相同…...
WordPress主题YIA在广告位添加图片广告时下方有空白怎么办?
YIA主题设置中默认有4个广告位,而侧边栏的广告位由站长自行添加。boke112百科在这些广告位添加图片广告后发现图片下方有空白,导致下方的两个角没有变圆角,看起来也有点不好看。具体如下图所示: 其实,这个问题就是典型…...
5.15 BCC工具之kvm_hypercall.py解读
一,工具简介 在该示例中,我们可以了解到如何使用eBPF(扩展BPF,Berkeley Packet Filter的扩展)和bcc(BPF Compiler Collection)来分析KVM(Kernel-based Virtual Machine)中的超级调用(hypercall)。 即当exit_reason为VMCALL时,有状态的kvm_entry和kvm_exit记录以及…...
git 解除本地分支与其它分支(远程分支)的关联
开发中,我在同事的分支开一条分支,并将同事的分支作为关联分支,前两天还好,我一个人在干活,然而第3天,同事回来了,他在他那条分支也开发,这时就会出现2种情况, 1. 同时修…...
conda 所有的命令及其讲解
Conda 是一个开源的包管理器和环境管理器,可以用于安装、运行和升级跨平台的软件包和环境。Conda 很流行于数据科学、机器学习、科学计算等领域,因为它能够快速地安装、管理和部署软件包和环境。以下是 Conda 的一些主要命令及其简要说明: 环…...
mysql 数据库主从复制搭建
MySQL 主从复制主要用于实现高可用性和备份。在主从复制中,一个 MySQL 实例(称为主节点)将其数据更改复制到至少一个其他 MySQL 实例(称为从节点)上。主要借助于数据库二进制日志binlog进行数据的复制。 主从数据库对应…...
小白水平理解面试经典题目LeetCode 1025 Divisor Game【动态规划】
1025 除数游戏 小艾 和 小鲍 轮流玩游戏,小艾首先开始。 最初,黑板上有一个数字 n 。在每个玩家的回合中,该玩家做出的动作包括: 选择任意 x,使 0 < x < n 和 n % x 0 。将黑板上的数字 n 替换为 n - x 。 此…...
基于单片机的智能宠物喂食器设计
摘要:阐述智能宠物喂食器的实现方式,以STC89C52单片机为核心芯片,控制LCD的显示、语音芯片的启动和步进电机的运行。通过按键设置预设时间,当时间到达预设时间时,语音电路发出提示,步进电机工作,提供食物。此系统解决了主人由于各种原因不在家,使得宠物不能按时吃饭的问…...
探索单片机应用领域:从智能家居到工业自动化
单片机作为一种微型计算机芯片,在智能家居和工业自动化领域有着广泛的应用。以下将从智能家居和工业自动化两个方面分点论述单片机的应用。 智能家居领域: 1. 智能灯光控制: 单片机可以用于控制智能灯光系统,实现灯光的远程控制…...
Nginx介绍和使用
Nginx是一个高性能的HTTP和反向代理web服务器,其使用方法包括安装、配置以及与其他软件的配合使用。 Nginx被广泛认为是一个轻量级、占用资源少、并发处理能力强大的web服务器软件。它不仅可以作为HTTP服务器提供静态内容服务,还可以作为反向代理服务器…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...
MCP和Function Calling
MCP MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而…...
