Java泛型(“代码模板”,一套代码套用各种类型)
1.什么是泛型
a.定义
i.如果不用泛型定义,在使用ArrayList时需要为每个class编写特定类型代码。
ii.泛型就是定义一种模板,既实现了编写一次,万能匹配,又通过编译器保证了类型安全。
iii.编写模板代码来适应任意类型。


b.向上转型
i.带有泛型的类如果存在继承关系可以向上转型,泛型本身不可以直接向上转型。
ii.特别注意:ArrayList<Integer>和ArrayList<Number>两者完全没有继承关系。
iii.可以把ArrayList<Integer>向上转型为List<Integer>(T不能变!),但不能把ArratList<Integer>向上转型为ArrayList<Number>(T不能变成父类)。


2.使用泛型
a.优势
i.不指定时泛型类型默认为Object,需要强制转型,可能出现类型转换错误,很不方便。
ii.使用泛型时,把泛型参数<T>替换为需要的class类型。
b.泛型接口
i.除了在class中使用泛型,还可以在接口中使用泛型。例如:Arrays.sort(Object[] o)可以对任意数组排序,但是待排序的元素必须实现Comparable<T>这个泛型接口。
ii.可以在接口中定义泛型类型,实现此接口的类必须实现正确的泛型。




3.编写泛型
a.编写泛型类
i.泛型类一般用在集合中,我们很少编写。
ii.编写泛型时,需要定义泛型类型<T>。

b.静态方法
i.类定义的泛型类型不能用于静态方法,即不可用于静态方法的返回值和参数。
ii.对于静态方法,可以单独改写为“泛型”方法,使用另一个泛型,把静态方法和实例方法的泛型类型区分开。

c.多个泛型类型
i.希望不总是存储相同类型的对象,就可以定义多个泛型。
ii.java标准库的Map<K,V>就是使用两种泛型的例子。他对Kety使用一种类型,对Value使用另一种类型。

4.擦拭法
a.含义
i.Java的泛型实现方式是擦拭法,虚拟机对泛型一无所知,所有工作都是编译器做的。
ii.Java使用擦拭法实现泛型。
1.编译器把类型<T>视为Object。
2.编译器根据<T>实现安全的强制类型转换。
b.编译器和虚拟机看到的代码区别
i.编写泛型
1.编译器看到的

2.JVM看到的

ii.使用泛型
1.编译器看到的

2.JVM看到的

iii.总结:Java的泛型是由编译器在编译期间实行的,编译器内部永远把所有类型T都视为Object处理;在需要转型时,编译器会根据T类型实现安全的强制类型转换。
c.局限性
i.<T>不能是基本数据类型,T实际类型是Object,Object无法持有基本数据类型。
ii.不能取得带泛型类型的Class,无论T是什么类型,返回的永远是Pair当前类的这个Class实例,而不是T的Class。

iii.不能判断带泛型类型的类型,都是Object。
iv.不能实例化T,如果要实例化需要传入具体的数据类型。


d.泛型继承
i.一个类可以继承自一个泛型类。
ii.直接带泛型的类,无法获取到T类型,但是在父类是泛型的情况下,编译器就必须把T保存到子类的class文件中,不然编译器不知道intPair中只能存取Integer类型,所以在继承了泛型情况下,子类可以获取父类的泛型类型。

iii.因为引入了泛型,所以只用class来标识类型已经不够了。

5.extends通配符(上界通配符(Upper Bounds Wildcards))
a.使用方式
i.Pair<Integer>不是Pair<Number>的子类。


ii.Pair<? extends Number>:泛型类型的上界限定为Number,可以是Number或Number的子类的pair类型。

b.只读不写
i.<? extends Number>:通配符做为方法参数时,当前方法只可以获取不可以传入(null除外),只读不写。
ii.因为擦拭法。


c.总结
i.使用<? extends Number>做为方法参数时:
1.方法内部可以调用获取Number引用的方法:Number num=obj.getFirst();。
2.方法内部无法调用传入Number引用的方法(null除外):obj.setFitst(Number n);
ii.extends通配符只读不写。
6.super通配符
a.使用方法
i.Pair<Integer>不是Pair<Number>的子类。
ii.Pair<? super Integer>:泛型类型可以是Integer或Integer的父类的Pair类型。


b.只写不读
i.<? super Integer>:通配符做为方法参数时,当前方法只可以传入不可以读取(Object接收除外),只写不读。
ii.向下转型时本就不安全,需要instanceof判断。
iii.因为擦拭法。

c.对比extends和super通配符
i.<? entends T>:只读不写(写时可传入null)。
ii.<> super T>:只写不读(读时可返回Object)。
d.PECS原则(Producer Extends Consumer Super)
i.如果需要返回T,它是生产者,需要使用extends通配符;如果需要写入T,它是消费者,需要使用super通配符。
e.无限定通配符(Unbounded Wildcard Type)
i.既没有extends又没有super,所以<?>既不能读也不能写。
ii.不能调用set(T),传入null除外。
iii.不能调用T get(),object获取除外。
iv.Pair<?>是所有Pair<T>的超类。
f.总结
i.使用<? super Integer>做为方法参数时:
1.方法内部可以调用传入Integer引用的方法:obj.setFirst(Integer i);。
2.方法内部无法调用获取Integer引用的方法(Object除外):Integer i = obj.getFirst();。
ii.super通配符只写不读。
iii.使用extends和super通配符要遵循PESC规则。
iv.无限定通配符<?>很少使用,既不能读也不能写,可以用<T>替换,同时它是所有<T>的超类。
相关文章:
Java泛型(“代码模板”,一套代码套用各种类型)
1.什么是泛型 a.定义 i.如果不用泛型定义,在使用ArrayList时需要为每个class编写特定类型代码。 ii.泛型就是定义一种模板,既实现了编写一次,万能匹配,又通过编译器保证了类型安全。 iii.编写模板代码来适应任意…...
速响低代码平台:升级营销管理系统,开启高效无忧新体验!
当前日新月异的商业环境,企业面临着前所未有的挑战与机遇。随着市场竞争的日益加剧和企业业务的不断拓展,传统的营销方式和管理手段逐渐显露出其局限性,难以适应快速变化的市场需求。 数据收集难:传统的营销管理缺乏对客户数据的收…...
Gitlab升级14.0.12-->14.3.6遇到的gitlab-ctl reconfigure错误
问题描述 在按照官方文档升级路线11.0.2>17.2.2的过程中,升级14.0.12–》14.3.6时遇到一个错误: Running handlers: There was an error running gitlab-ctl reconfigure:rails_migration[gitlab-rails] (gitlab::database_migrations line 51) had…...
JDBC导图
思维歹徒 一、使用步骤 二、SQL注入 三、数据库查询(查询) 四、数据库写入(增删改) 五、Date日期对象处理 六、连接池使用 创建连接是从连接池拿,释放连接是放回连接池 七、事务和批次插入 八、Apache Commons DBUtil…...
飞思实验室与中飞院联合开发教学课程,校企联袂共绘教育蓝图
近日,飞思实验室与中国民用航空飞行学院(以下简称“中飞院”) 航空电子电气学院合作,共同开发《无人智能视觉导航控制技术》、《多旋翼无人飞行器集群系统》实验课程。这一举措旨在深化校企融合,学校通过引入企业带来的…...
Telephony Call
1、Telephony 架构 Telephony整体架构和Android架构一样的,包括APP层,框架层,HAL层,内核层。 其中HAL层不同平台实现方式不同,其中MTK SPRD 平台使用AT通道的方式实现,高通使用QMI方式实现。 2、通话业务介绍 APP包括Dialer.apk、TeleService.apk、Tele…...
Python--TCP/UDP通信
文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.客户端与服务端通信原理 1. 服务器端 服务器端的主要任务是监听来自客户端的连接请求,并与之建立连接,然后接收和发送数据。 创建套接字:首先࿰…...
【已解决】请教 “Sa-Token 集成 xxl-job,报错:非 web 上下文无法获取 HttpServletRequest” 如何解决
1. xxl-job 报错日志 2024-09-11 17:19:04 [com.xxl.job.core.thread.JobThread#run]-[133]-[xxl-job, JobThread-3-1726046344528] <br>----------- xxl-job job execute start -----------<br>----------- Param: 2024-09-11 17:19:04 [com.xxl.job.core.thread…...
Redis——常用数据类型string
目录 常用数据结构(类型)Redis单线程模型Reids为啥效率这么高?速度这么快?(参照于其他数据库) stringsetgetMSET 和 MGETSETNX,SETEX,PSETEXincr,incrby,decr…...
架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间
本文首发在这里 重中之重就是想实现无锁!无锁!无锁! 源码 servergolang 预计还会实现gate_server,接受并保持websocket长连接,按需双向流到game_server进行消息转发 未来上述服务均会以容器的形式由k8s自动化部署、…...
个人随想-gpt-o1大模型中推理链的一个落地实现
首先祝大家中秋节快乐。 最近openai又推出了新的模型openai o1还有它的mini版。官网的介绍,就是它的推理能力很强,比gpt-4o有很大的提升。 最近也跟同行在聊这个o1,看看落地方面有哪些可行性。在我们自己的实验上,把o1用…...
python解析ip范围,判断ip是否在ip范围内
目录 1. 背景 2. 代码使用示例 2.1 分割ip,横杠 (-) 的ip范围 2.2 判断ip在掩码(/)的范围内 2.3 判断ip在横杠(-)的范围内 2.3.1 格式:192.168.1.1-192.168.1.10 2.3.2 格式&…...
Springboot错误日志切面,找到post请求体被消费后的数据
问题记录:测试环境接口报错,日志里没有请求参数等信息,于是写了一个切面,但切面中获取不到 request的请求体,因为 post 请求体只能被消费一次,于是找解决办法 解决方法 既然 request 被消费了导致对应的请…...
【二十】【QT开发应用】listwidget右键菜单和删除item
创建项目,添加资源文件 在项目文件夹中创建resources资源文件夹。 在vs中打开qrc文件,选择添加资源文件。 选择我们resources资源文件中的所有文件作为资源文件。 最后不要忘记点击保存。 向ListWidget控件添加item 右键菜单 在.h文件中添加QMenu头…...
LabVIEW机动车动态制动性能校准系统
机动车动态制动性能测试系统通过高精度的硬件设备与LabVIEW软件的紧密配合,实现了对机动车制动性能的精确校准与评估。系统不仅提高了测试的精确性和效率,而且具备良好的用户交互界面,使得操作更加简便、直观。 项目背景 随着机动车辆数量的…...
Linux(CentOS8)服务器安装RabbitMQ
我安装了很久都没有成功, 各种问题, 每次的异常都不一样, 现将成功安装过程做个总结 安装前工作 确保已经安装了一些基础工具和组件库 下载安装包 https://www.erlang.org/patches/otp-24.3.4.5 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.15/ra…...
R语言进行无序多分类Logistic回归
在临床研究中,接触最多的是二分类数据,如淋巴癌是否转移,是否死亡,这些因变量最后都可以转换成二分类0与1的问题。然后建立二元logistic回归方程,可以得到影响因素的OR值。但有时我们也会接触到多分类结局数据…...
Maven从入门到精通(三)
一、Settings 配置 settings.xml 用来配置 maven 项目中的各种参数文件,包括本地仓库、远程仓库、私服、认证等信息。 全局 settings、用户 setting、pom 的区别: 全局 settings.xml 是 maven 的全局配置文件,一般位于 ${maven.home}/conf…...
Red Hat 和 Debian Linux 对比
原图的作者(https://bbs.deepin.org/post/209759) Red Hat Enterprise Linux https://www.redhat.com/ CentOS Linux https://www.centos.org/ Fedora Linux https://fedoraproject.org/ Debian https://www.debian.org/ Ubuntu https://cn.ubuntu.com/ https://ubuntu.c…...
Axure设计之全屏与退出全屏交互实现
在Axure RP中,设计全屏与退出全屏的交互功能可以极大地提升用户体验,尤其是在展示产品原型或进行演示时。本文将详细介绍如何在Axure RP中通过结合JavaScript代码实现全屏与退出全屏的交互效果。 Axure原型设计web端交互元件库:https://…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
