【java】泛型
文章目录
- 1. 什么是泛型?
- 1.1 背景
- 1.2 泛型的概念
- 1.3 泛型的好处
- 2. 泛型类、接口...
- 2.1 泛型类
- 2.2 从泛型类派生子类
- 2.2.1 子类也是泛型类,子类和父类的泛型类型要一致
- 2.2.2 子类不是泛型类,父类要明确泛型的数据类型
- 2.3 泛型接口
- 2.4 泛型方法
- 2.5 类型通配符
- 2.5.2 类型通配符的上限
- 2.5.3 类型通配符的下限
- 3. 类型擦除
- 3.1 无限制类型擦除
- 3.2 有限制类型擦除
- 3.3 擦除方法中类型定义的参数
- 3.4 桥接方法
- 3.5 泛型与数组
- 3.5.1 泛型数组的创建
- 3.6 泛型和反射
- 3.6.1 反射常用的泛型类
【后端&网络&大数据&数据库目录贴】
参考视频
1. 什么是泛型?
1.1 背景
JAVA推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常。
1.2 泛型的概念
Java泛型(generics)是
JDK5
中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时
检测到非法的类型数据结构。
泛型的本质就是参数化类型
,也就是所操作的数据类型被指定为一个参数
。
1.3 泛型的好处
- 类型安全
- 消除了强制类型的转换
2. 泛型类、接口…
2.1 泛型类
泛型类的定义语法
class 类名称 <泛型标识,泛型标识,…> {private 泛型标识 变量名; .....
}
常用的泛型标识:T、E、K、V
使用语法
类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();
Java1.7以后,后面的<>中的具体的数据类型可以省略不写(
菱形语法
)
类名<具体的数据类型> 对象名 = new 类名<>();
泛型类注意事项
- 泛型类,如果没有指定具体的数据类型,此时,操作类型是Object
- 泛型的类型参数只能是
类类型
,不能是基本数据类型
- 泛型类型在逻辑上可以看成是多个
不同的类型
,但实际上都是相同类型
2.2 从泛型类派生子类
2.2.1 子类也是泛型类,子类和父类的泛型类型要一致
class ChildGeneric<T> extends Generic<T>
2.2.2 子类不是泛型类,父类要明确泛型的数据类型
class ChildGeneric extends Generic<String>
2.3 泛型接口
泛型接口的定义语法
interface 接口名称 <泛型标识,泛型标识,…> {泛型标识 方法名(); .....
}
泛型接口的使用
实现类不是泛型类,接口要明确数据类型
实现类也是泛型类,实现类和接口的泛型类型要一致
2.4 泛型方法
泛型类
,是在实例化类的时候指明泛型的具体类型。
泛型方法
,是在调用方法的时候指明泛型的具体类型。
语法
- public与返回值中间
<T>
非常重要,可以理解为声明此方法为泛型方法
。- 只有声明了
<T>
的方法才是泛型方法
,泛型类中的使用了泛型的成员方法并不是泛型方法
3.<T>
表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T- 与泛型类的定义一样,此处T可以随便写为任意标识,常见的如
T、E、K、V
等形式的参数常用于表示泛型。- 泛型方法的泛型标志
独立
于泛型类,(泛型类使用T,泛型方法也可以使用T,不冲突)(泛型方法能使方法独立于类而产生变化
)- 如果static方法要使用泛型能力,就必须使其成为泛型方法.(
成员方法使用类的泛型不可以
)
修饰符 <T,E, ...> 返回值类型 方法名(形参列表) {方法体...
}
可变参数泛型方法
public <E> void print(E... e){for (E e1 : e) {System.out.println(e);}}
2.5 类型通配符
类型通配符一般是使用
"?"
代替具体的类型实参
。
所以,类型通配符是类型实参
,而不是类型形参
。(经过查询资料,并不是实参的说法)
语法
类/接口<?>
2.5.2 类型通配符的上限
语法
类/接口<? extends 实参类型>
要求该泛型的类型,只能是实参类型,或实参类型的子类类型
。(不能够填充任何类型数据)
2.5.3 类型通配符的下限
语法
类/接口<? super 实参类型>
要求该泛型的类型,只能是实参类型,或实参类型的父类类型
。(可以填充任何类型数据)
注意:
//问题1:不能重载,本质依然是同一类型(泛型是同一类型)public void showBox(Box<Number> box) {Number first = box.getFirst();System.out.println(first);}public void showBox(Box<Integer> box) {Number first = box.getFirst();System.out.println(first);}//问题2:这里不能通过多态理解,多态理解不能接收Integerpublic void showBox(Box<Number> box) {Number first = box.getFirst();System.out.println(first);}
3. 类型擦除
泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是,泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为–
类型擦除
。
3.1 无限制类型擦除
3.2 有限制类型擦除
3.3 擦除方法中类型定义的参数
3.4 桥接方法
3.5 泛型与数组
3.5.1 泛型数组的创建
- 可以声明带
泛型
的数组引用,但是不能直接创建
带泛型的数组对象 - 可以通过
java.lang.reflect.Array
的newInstance(Class<T>,int)
创建T[]
数组
3.6 泛型和反射
3.6.1 反射常用的泛型类
Class<T>
Constructor<T>
相关文章:

【java】泛型
文章目录 1. 什么是泛型?1.1 背景1.2 泛型的概念1.3 泛型的好处 2. 泛型类、接口...2.1 泛型类2.2 从泛型类派生子类2.2.1 子类也是泛型类,子类和父类的泛型类型要一致2.2.2 子类不是泛型类,父类要明确泛型的数据类型 2.3 泛型接口2.4 泛型方…...

计算思维的理解
2006年,卡内基梅隆大学周以真教授首次系统性地定义了计算思维。这一年,她在美国计算机权威期刊《Communications of the ACM》上发表了题为《Computational Thinking》的论文,由此开启了计算思维大众化的全新历程。 周以真(Jeanne…...

Python中tkinter编程入门4
在Python中tkinter编程入门3-CSDN博客中创建了Button控件,点击该控件就会产生一个点击事件,在创建Button控件时指定该点击事件的处理程序后,按键控件就会对用户的点击事件产生响应。 1 定义事件处理器 定义事件处理器就是一个自定义的函数。…...

Milvus的系统架构
简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的,它针对稠密向量数据集的相似搜索而设计,能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片,流式数据插入,动态schema,…...

MFC中关于CMutex类的学习
MFC中关于CMutex类的学习 最近在项目中要实现两个线程之间的同步,MFC中提供了4个类,分别是CMutex(互斥量)、CCriticalSection(临界区)、CEvent(事件对象)、CSemaphore(信号量)。有关这4个类的说明,大家可以参考微软官方文档: CM…...

删除表空间
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 当某个表空间中的数据不再需要时,或者新创建的表空间不符合要求时,可以考虑删除这个表空间。若要删除表空间,则需要用户具有 DROP TABLESP…...

下载element-ui报错
此错误表示尝试从npm注册表下载“resize observer polyfill”包时超时。这可能是由于网络连接问题或npm注册表服务器的问题。 要解决此问题,您可以尝试以下步骤: 1.重试npm install命令:有时,网络问题会导致临时超时。再次运行npm…...
[原创](Modern C++)现代C++的std::bind花式绑定,使用方式大全.
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...

Unity射击游戏开发教程:(13)如何在Unity中播放音效
在本文中,我将向大家展示一些为游戏添加声音的不同方法。 我们为游戏添加声音的第一种方法是播放背景音乐。在此,我们将创建游戏对象(“音频管理器”)并创建一个子游戏对象(“背景音乐”)。该子游戏对象将是播放音乐的对象,因此需要向其添加音频源组件。如果没有音频源组…...
Swift—手写防抖、手写图片预加载与多张图片拼接
什么是防抖,为什么要防抖? 比如我们在文档在线编辑中修改文档内容,总不能打一个字就发送一次更新请求吧,用户疯狂点击一个按钮,总不能一直触发按钮的逻辑吧。防抖被用于避免频繁触发的事件。 Swift实现防抖代码&…...
Redis过期键删除策略
Redis有三种过期键的删除策略。 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除策略。惰性删除:放任键过期不管,但每次从键空间获取键时,…...
413 Request Entity Too Large
问题 平台上传文件接口报:413 Request Entity Too Large。 原因 从字面意思就能看出来,是上传文件过大导致的。 一般解决 一般情况下修改nginx配置文件中client_max_body_size参数的大小就行了。可以在http{ }中设置。也可以在server{ }中设置。还可…...

工业无风扇计算机的优点
无风扇计算机往往采用紧凑且密封的外形,使其坚固耐用,使其能够在需要现场工程师进行维护之前承受恶劣的环境数年。机载移动部件较少或没有移动部件会降低组件无法按预期运行的可能性,或者更糟糕的是发生故障和损坏。采用工业组件和较低的散热…...
个人学习计划
vue前端(一周) 05/14 - 05/19 Html、css复习、vue基础复习、axios复习 05/14 ElementUI学习 05/15 JWT集成验证码、token 05/16 vue-route多角色登录 05/17 增删查改、文件下载 05/18 Echart饼状图 05/19 📌 附加学习: 父子传值三…...

【电控实物-LK电机】
参数 Kt 0.11 N.M/A...

《Mybatis》系列文章目录
什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJOÿ…...

ARM机密计算组件
安全之安全(security)博客目录导读 目录 一、硬件架构 1、RME 二、软件和固件架构 1、RMM 2、其他固件标准(例如PSCI) 三、开源实现 1、TF-A 2、Veraison 3、工具链 四、动态TrustZone技术 Arm机密计算架构(Arm CCA)引入了一系列硬件和软件…...

Linux 生态与工具
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 目录 Linux生态简介:Linux工具lrzszÿ…...
RHCE网络服务配置之循环执行的例行性工作
1、什么是循环执行的例行性工作 循环执行的例行性工作:每隔一定的周期就需要执行一次 2、crontab的工作过程 /etc/cron.allow,写在该文件的人可以使用crontab命令 /etc/cron.deny,黑名单 两个文件如果都不存在,只有root能使用…...

vue3使用el-radio-group获取表格数据无法选中问题
这里是引用 今天写项目发现使用el-radio-group无法获取表格中的数据,于是去官网查看了一下,发现写的没啥问题,就是 <el-radio value"1" size"large"> 未知</el-radio>这样的写法,又在网上看了一些…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...