【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服务器提供静态内容服务,还可以作为反向代理服务器…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...