【Java学习】泛型

ops/2025/3/11 7:25:08/

面向对象系列八

一、泛型类变量

二、泛型实现

1.编译检查

2.类型擦除

3.泛型效果

三、类型检查

1.向上转型相关:

2.数组相关:

四、extend

1.非泛型下:

2.泛型中:


一、泛型类变量

一个类变量对里面位置引用变量的类型通泛性,每创的一次似复刻变量就能对应实现那一种的引用类型的那一套,一个类变量能通泛性地创它里面位置引用变量所有类型的似复刻变量,对它里面位置引用变量的类型是泛性的所有类型的都能实现的,这种它里面对应位置引用变量全类型都能针对实现的类变量就是泛型类变量,一个模板它能对应去创所有引用类型套的但去实现时是一次只能实现一种套的那种不太泛的泛型


二、泛型实现

1.编译检查

创泛型类变量的似复刻变量,编译检查时,将这个创的似复刻变量去对应实现的具体那某引用类型套的似复刻变量引用去对应替换到里面泛型对的的位置引用变量T上来进行检查的,这样替换后的检查能实现对应具体类型在对应具体编译检查要求下去实现,对实现具体某一个引用类型套有了对应的编译检查保障,确保了外界使用能进来后的数据一定是此T类型下的数据


2.类型擦除

对进来后的数据进行编译检查通过后,将此泛型类变量里面的T引用变量全部擦除Object类变量的似复刻变量引用外部代码里调用使用此泛型类变量里以T引用变量为返回值方法的调用返回值处隐式加上对应实现的具体引用类型的强转,之后去运行,会发现在泛型类变量里面,


3.泛型效果

执行操作的一直都是Object类的似复刻变量,外界引用进来都是向上转型成Object类似复刻变量引用进来的,它通过编译类型检查指定确定了使用进入此泛型类变量里向上转型为Object类的似复刻变量的原下子类类型,对已知其下原子类类型的Object类似复刻变量在作为此泛型类变量里方法返回值处的对应去外部调用它处插入强转能对应向下转型回已知原子类类型的指定引用回来在外部,这样就实现了泛型类变量内部用所有类统一能用的Object父类来共用外部不同类的使用处又能对应针对到各自不同的外部引用类,达到所有类都能使用且是全效果地使用它的泛型效果


三、类型检查

  • 明确安全的转化正常直接转(向上转型)
  • 可能安全的转化强转下编译可通过(运行时如果发现是危险的也报错)
  • 一定危险的强转也编译报错

1.向上转型相关:

public T[] array = (T[])new Object[10]

编译检查时,array似复刻变量数组元素是以指定似复刻变量引用类型检查的

这里强转后不报错编译通过的原因是Object类似复刻变量引用数组可能是通过T[]对应向上转型而来的(它们俩本身明确有继承关系)如果是这样,去向下转型是安全的,所以可能是安全的,强转后编译是允许通过的,具体看运行时,发现是(Object[])Object[],安全通过地运行,最后运行时也通过了

其实此语句最后一直执行的都是Object[] array = (Object[]) Object[10],换哪个指定引用类型去创建此泛型似复刻变量最后里面创建的都是它这样,那为什么不直接Object[] array = (Object[]) Object[10]创建呢?因为它和类变量下面的其它T一样,都是要去实现指定类型的检查的


Object object = new Object();
String string = new String();
string = (String) obejct;

编译时通过的,因为Object类与String类成继承关系,此object可能是string向上转型来的,编译器不知道,有可能安全的,所以编译时加上强转后是编译通过的,具体看运行时,发现object并不是此string向上转型来的,给它强转无法向下转型的,报错


2.数组相关:

基本数据类型的数组之间转化是一定危险报错的,因为空间都明确不一样

引用类型数组的转化就正常与它元素一样的看,因为每个引用变量空间都是固定统一的:

  • 引用变量之间是继承下且是子类对父类的向上转型就可直接转编译与运行都通过
  • 继承下父类往子类强转编译时通过运行时再具体看此父类是否是由子类先向上转型来的而决定运行时能否通过

四、extend

1.非泛型下:

  • extend是继承,两边必须是相同性质的,类单继承类,接口多继承接口
  • implements是实现,左边一定是类,右边一定是接口类实现多接口

2.泛型中:

但在泛型中,统一用extend来声明边界,左边是指定的泛型类T,右边可以是类或接口:

  • 是类时表明此泛型引用类将会去执行继承此类(如果它们俩实在是无法连接成继承关系的,编译器检查时就会报错)
  • 是接口时表明此泛型引用类将会去执行连接此接口(到了具体指定的引用类那边就会有要求去实现接口里面的抽象方法)

可以同时定义多个边界<T extends A & B & C>:T必须可以去继承A的且有实现B和C接口方法的

编译擦除时将T擦除为边界类型(没有定义边界类型的默认边界为Object,擦除时就擦除为边界Object)

泛型方法在修饰符最后加上<T>来定义调用时在方法名最前面加上<具体指定类型>


http://www.ppmy.cn/ops/164862.html

相关文章

HTTPS加密原理详解

目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议&#xff0c;是在HTTP的基础上加入了一个加密层&#xff0c;由…

Vue 项目中,.env文件怎么用?

在 Vue 项目中&#xff0c;.env 文件用于存储环境变量&#xff0c;不同的环境&#xff08;如开发环境、测试环境、生产环境&#xff09;可以使用不同的 .env 文件来管理对应的配置信息。以下是关于 Vue 项目中 .env 文件的详细使用方法&#xff1a; 1. 项目创建 确保你已经使…

linux wifi driver深度实践之内核编译加载

基础 硬件基础&#xff1a;随处可以买到的TP-WN722N V1网卡软件基础&#xff1a;linux-source-5.3.0 内核源码源码路径&#xff1a;drivers/net/wireless/ath/ath9k/常见wifi接口协议&#xff1a;包括PCIe、USB、SDIO等。 安装内核源码包 Ubuntu 提供了内核源码包&#xff0…

SpringCloud——环境搭建

一、从Boot和Cloud版本选型开始说起 &#xff08;1&#xff09;无伤速通版 &#xff08;2&#xff09;详细推演版 1.2.1SpringCloud 分为上下两场 上篇SpringCloud下篇SpringCloud Alibaba上下篇没有严格的顺序要求&#xff0c;各自独立&#xff0c;截然不同 1.2.2SpringBo…

网络DNS怎么更改?

访问速度慢或某些网站无法打开?改变网络DNS设置可能会帮助解决这些问题。本文将详细介绍如何更改网络DNS&#xff0c;包括更改的原因、具体步骤。 一、为什么要更改DNS? 更改DNS的原因有很多&#xff0c;以下是一些主要的考虑因素&#xff1a;某些公共DNS服务器的响应速度比…

STM32之I2C硬件外设

注意&#xff1a;硬件I2C的引脚是固定的 SDA和SCL都是复用到外部引脚。 SDA发送时数据寄存器的数据在数据移位寄存器空闲的状态下进入数据移位寄存器&#xff0c;此时会置状态寄存器的TXE为1&#xff0c;表示发送寄存器为空&#xff0c;然后往数据控制寄存器中一位一位的移送数…

Java进阶:Zookeeper相关笔记

概要总结&#xff1a; ●Zookeeper是一个开源的分布式协调服务&#xff0c;需要下载并部署在服务器上(使用cmd启动&#xff0c;windows与linux都可用)。 ●zookeeper一般用来实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能。 ●有多台服…

蓝桥杯算法——铠甲合体

问题描述 暗影大帝又开始搞事情了&#xff01;这次他派出了 MM 个战斗力爆表的暗影护法&#xff0c;准备一举摧毁 ERP 研究院&#xff01;MM 个暗影护法的战斗力可分别用 B1,⋯,BMB1​,⋯,BM​ 表示。 ERP 研究院紧急召唤了 NN 位铠甲勇士前来迎战&#xff01;每位铠甲勇士都…