泛型--java进阶day10

news/2025/4/1 3:52:26/文章来源:https://www.cnblogs.com/zhishi6/p/18799429

1.泛型

2.泛型--统一数据类型

如下图,当我们在泛型中添加不同的数据类型,add方法需要的数据类型也随之改变

[1]


[2]

泛型--默认类型object

当我们不指定泛型时,泛型的默认类型为object,所以add方法可以存储任意数据类型

3.泛型--将运行期间错误提升到编译期

如下图,我们在集合中添加了一些元素,使用迭代器遍历集合,然后想调用length方法查看集合长度,发现报错

报错的原因,在迭代器获取元素的那一行,左边是父类引用object,右边是子类

编译期间先看父类有没有length,再调用子类逻辑,很明显object类是不存在length这个方法的,所以报错

解决的方法很简单,使用向下转型

接着,我们右键运行程序,控制台打印的都是2,没有问题

但是,在object类型向下转型为String时没有报错,是因为我们添加的都是字符串类型,如果集合中存储了其他数据呢?如下图

我们将集合的泛型删去,可以添加任意的数据类型变量,此时我们添加一个随机数对象,发现程序没有报错

此时,我们右键进行运行,控制台出现了类型转换异常

异常的原因也能想清楚,随机数对象不可以向下转型为字符串

我们仔细想想,如果我们在集合中加了String泛型,那这个异常还会保留到运行期吗?

添加了泛型后,便会在编译期间报错,完全到不了运行期

这就是泛型将运行期错误提升到了编译期

4.泛型的学习路径

常见的泛型标识符

泛型标识符就是<>里面的字母,当个提示来看,没什么特殊含义

泛型的学习路径中,我们还需要学习一点,如下图

1.泛型类:创建对象的时候指定泛型

集合中可以指定泛型,我们自己当然也可以指定泛型,如下图,我们自己写一个类然后指定一个泛型

但是指定了这个泛型有什么用呢?

--假如我们要写一个变量或是方法,但是当时没想到要用什么类型,就可以使用泛型,等到创建类的时候再进行具体类型指定

2.泛型方法

泛型方法分为两种,一种非静态,一种静态

它们指定泛型的时机,如下图

[1]非静态方法

我们刚才在说泛型类的时候就使用到了泛型方法中的非静态方法,比如setE

泛型类是什么泛型,非静态方法的泛型也就跟着是什么类型

[2]静态方法

如下图,我们写了一个方法,然后使用不同数据类型的数组进行调用

报错的原因很简单,其他两个数组的数据类型和方法形参类型不匹配,我们就会发现这个方法局限性很大,不够灵活

那如果我们想让这个方法更加灵活该怎么做呢?--在方法中添加泛型

如图,我们在静态方法中指定泛型,这时方法就可以根据传入的数组来确定形参的类型,从而让该方法可以接收任意类型的数组

如上图,静态方法报错,这是因为静态方法不知道自己现在是什么类型

那之前说了方法跟着类走,我们试着在类上也指定个泛型能否有效呢?

如上图,静态方法还在报错,这是为什么呢?

想一想,类的泛型是什么时候确定的?--创建类的时候

而静态修饰的方法是优先于对象存在的,所以这个静态方法存在时,类还确定不到具体类型,当然不能根据类来指定静态方法的泛型了

既然不能跟着类混,那静态方法就要自己独自声明泛型,如下图,不再报错

静态方法确定泛型的时机:调用静态方法时

之前说过,泛型是只能指定引用数据类型,所以所有的基本数据类型都无法通过泛型修饰

3.泛型接口

1.泛型接口:在实现类实现接口时,指定泛型

假如,我们写了一个接口,里面的方法无法直接确定类型,就可以使用泛型,等到类实现接口时,再指定实际类型

2.泛型接口:实现类也声明泛型,等到创建对象时再确定实际类型

我们写了一个接口,无法确定具体类型,所以声明了一个接口,当实现类去实现泛型接口时,它也无法确定是什么类型,那就继续声明泛型


..

当创建这个实现类时,再确定具体类型

4.泛型通配符

当我们写了一个方法,想让这个方法能接收任意类型的集合时,我们就可以使用泛型通配符

如图,method既能接收Coder类型的集合,也可以接收Manager类型的集合

当method接收了集合后,遍历集合,取出存在集合里的coder和manager对象,可以看见接收它们的变量是object类型

此时,object接收了它们,如果要调用work方法会报错,因为object类中不存在,所以要向下转型

为了确保这两个对象都能使用,我们使用它们的父类employee做向下转型

右键运行,没有问题

但是,该代码还存在安全隐患,泛型通配符是任意类型的集合都可以接,这样就极容易和向下转型产生类型转换异常 如图

我们希望泛型通配符只接收employee这个体系里的对象,不是这个体系的对象不进行接收 如下图

此时,String类型的list3就无法传入method


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web139笔记(过if和sleep来判断盲注)

<?php error_reporting(0); function check($x){if(preg_match(/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i, $x)){die(too young too simple sometimes naiv…

App性能测试工具-solopi

Solopi 简介Solopi 是阿里的一款开源的APP测试工具,能对App进行UI自动化测试和性能测试,而且还能进行单台设备控制多台测试设备 的工具。在使用Solopi 时不用进行root权限,但需要连接到adb(android SDK提供的命令行工具)。因此在使用Solopi之前需要开启开发者权限。 Solop…

US104S-ASEMI电机驱动专用US104S

US104S-ASEMI电机驱动专用US104S编辑:LL US104S-ASEMI电机驱动专用US104S 型号:US104S 品牌:ASEMI 封装:TO-220F 栅极触发电压(Vgt):1.3V。 栅极触发电流(Igt):0.2mA。 保持电流最大值(Ih):30mA。 正向重复电压(Vdrm):800V。 反向重复电压(Vrrm):800V。 通态…

deepseek+dify工作流实现代码审计

一、登录dify,设置deepseek apikey登录dify(https://cloud.dify.ai/signin)设置deepseek apikey二、创建dify工作流添加工作流应用写工作流三、添加待检测源代码,审计源代码安全问题修改待检测源代码项目的文件名后缀点击运行添加文件列表到工作流中四、与传统检测方式对比…

macbook安装Redis

1.下载Redis: https://redis.io/downloads/ ,进入网站拉到最低下就能看到可以下载的版本。 2.下载后解压缩,进入文件输入命令:sudo make test 执行完后出下面的图,就可以证明安装环境没有问题: 3.然后执行命令:sudo make install, 下图是安装成功 安装成功后:启动redi…

开源免费真香!Star 1.4k 这款开源在线教育系统让万人学习零压力,企业培训系统一键搭建神器

PlayEdu 是一款基于 SpringBoot3 + Vue3 开发的开源企业培训系统,提供从课程管理、学员管理到考试测评嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法PlayEdu 是一款基于 SpringBoot3 + Vue3 开发的开源企业培训系统,提供从课程管…

【VMware Workstation】虚拟机如何与宿主机共享文件夹

本文主要介绍VMware Workstation的虚拟机和宿主机之间如何共享文件第1步,打开VMware Workstation,并找到虚拟机的设置第2步,在虚拟机设置的选项卡中,点击 共享文件夹 ,并参考如下设置第3步,在弹出的共享文件夹向导窗口中,点击下一步第4步,选择宿主机共享给虚拟机的文件…

征程 6E mipi tx 系列之方案介绍

MIPI TX 到车机显示系统设计指南 IDE 介绍 征程 6 IDE 架构图 IDE(Image Display Engine)包含图像显示单元(Image Display Unit)、图像数据输出模块(MIPI CSI2 Device 和 MIPI DSI)。通过 IDU 从内存中读取图像数据进行处理,在 IDE 内部支持像素格式转换和像素结构转换,…

文件夹实时同步软件,怎么实时同步备份文件夹呢?

文件夹实时同步软件是一种非常实用的工具,可以帮助用户在不同设备或存储位置之间实时同步文件夹内容,确保数据的一致性和安全性。以下是一些常用的文件夹实时同步软件及其使用方法:常用文件夹实时同步软件 80KM备份软件 简介:可以进行很复杂的备份方式,也可以内网对内网备…

UE5--005--Animation

1. BP_ThirdPersonGameMode2. Project Settings3. Project Settings

第三课 运算符

1.算数运算符 除法运算:整数相除,结果依然是整数,将小数部分舍弃;实数相除,结果依然是实数 取余运算:两个小数是不可以做取余运算的 前置和后置的区别:前置:先对变量操作,然后进行表达式运算 后置:先进行表达式运算,后对变量进行操作2.赋值运算符3.比较运算符cout &…

使用AOP技术实现Java通用接口验签工具

一、背景 在给第三方提供接口时,我们需要对接口进行验签。具体来说,当外部系统调用我们的接口时,请求中需要携带一个签名,我们接收到请求后,会解析数据并校验签名是否正确,以确保请求的合法性和安全性。为了在不同项目中方便地使用这一功能,我们将签名校验规则封装成一个…