【Java学习】泛型

面向对象系列八

一、泛型类变量

二、泛型实现

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>来定义调用时在方法名最前面加上<具体指定类型>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测

摘要 本文提出了一种基于状态空间模型&#xff08;SSMs&#xff09;的创新架构——nnMamba&#xff0c;用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络&#xff08;CNN&#xff09;的局部特征提取能力与SSMs的全局上下文建…

探索在生成扩散模型中基于RAG增强生成的实现与未来

概述 像 Stable Diffusion、Flux 这样的生成扩散模型&#xff0c;以及 Hunyuan 等视频模型&#xff0c;都依赖于在单一、资源密集型的训练过程中通过固定数据集获取的知识。任何在训练之后引入的概念——被称为 知识截止——除非通过 微调 或外部适应技术&#xff08;如 低秩适…

OpenAI API模型ChatGPT各模型功能对比,o1、o1Pro、GPT-4o、GPT-4.5调用次数限制附ChatGPT订阅教程

本文包含OpenAI API模型对比页面以及ChatGPT各模型功能对比表 - 截至2025最新整理数据&#xff1a;包含模型分类及描述&#xff1b;调用次数限制&#xff1b; 包含模型的类型有&#xff1a; Chat 模型&#xff08;如 GPT-4o、GPT-4.5、GPT-4&#xff09;专注于对话&#xff0c…

【时间序列聚类】Feature-driven Time Series Clustering(特征驱动的时间序列聚类)

文章目录 1.文章介绍2.问题背景3.拟解决的问题4.主要贡献5.提出的方法5.1模型pipeline5.2特征抽取和选择5.3图渲染和社区检测5.4共现矩阵的构建5.5对共现矩阵进行聚类 6.实验6.1模型设置6.2实验结果6.3消融实验 7.结论8.个人观点9.Reference 1.文章介绍 论文出处&#xff1a;ED…

采用内存局部性分配有什么好处?

内存分配时的局部性分配&#xff08;Locality of Allocation&#xff09;是指将相关的内存对象分配在相邻或相近的内存区域中。这种分配策略在现代计算机系统中具有显著的好处&#xff0c;主要体现在以下几个方面&#xff1a; 1. 提高缓存命中率 现代计算机系统依赖于多级缓存…

Fast DDS Security--秘钥交换

Fast DDS Security模块中默认使用Diffie-Hellman算法进行秘钥交换。Diffie-Hellman 算法&#xff08;简称 DH 算法&#xff09;是一个非常重要的加密协议&#xff0c;用于在不安全的通信通道中安全地交换密钥。该算法通过利用数学中的离散对数问题来生成共享密钥&#xff0c;使…

3.3.5 VO-O语法- 高级语法

VO语言还提供了一些个性化的高级语法特性&#xff0c;这些语法特性有别于传统的编程语言。但可以更好的帮助开发者实现高效、稳定的生产级数据流程。 调度运行 在现行的编程语言中&#xff0c;调度运行不在语法表示范围之内。这属于具体的代码实现逻辑。但在VO语言设计中&…

NLP文本分析之依存句法分析(理论及技术实践)

引言 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;理解句子的语法结构是实现语义理解的基础。依存句法分析&#xff08;Dependency Parsing&#xff09; 作为句法分析的核心任务之一&#xff0c;通过揭示句子中词语之间的依存关系&#xff0c;为机器翻译、信…

LeetCode hot 100—爬楼梯

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例…

RoboVQA:机器人多模态长范围推理

23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案&#xff0c;该方案可用于长期和中期的高级推理&#xff0c;与传统的狭窄自上而下的逐步收集相比&#xff0c…

WWDG窗口看门狗原理

WWDG&#xff08;窗口看门狗&#xff09;在窗口期喂狗 作用&#xff1a; 原理&#xff1a; 框图 WWDG寄存器&#xff1a; WWDG_CR控制寄存器 WWDG_CFR配置寄存器 状态寄存器WWDG_SR 超时时间计算公式 最小最大超时值 HAL配置函数&#xff1a; 1. IWDG 和 WWDG 的区别 IWDG&…

基于Flink SQL的实时指标多维分析模型

数据流程介绍 1.创建源表kafka接入消息队列数据&#xff0c;定义字段映射规则&#xff1b; 2.创建目标表es_sink配置Elasticsearch输出&#xff1b; 3.通过多级视图&#xff08;tmp→tmp_dedup→tmp1/tmp2→tmp3→tmp_groupby&#xff09;实现数据清洗、去重、状态计算&#x…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA&#xff1a;检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景&#xff1a; GAN-SR模型虽然…

UIToolkit(一)

1 前言 UI Toolkit 是一种基于 Web 技术的 GUI 框架&#xff0c;是为了解决 UGUI 效率问题而设计的新一代 UI 系统&#xff08;UGUI 的介绍详见→UGUI概述&#xff09;。与 UGUI 不同&#xff0c;UI Toolkit 没有采用 GameObject 的方式&#xff0c;而是参考了 Web 技术的 XML …

Unsloth - 微调 Phi-4 + 修复 Bug

文章目录 Phi-4 错误修复1、分词器错误修复2、微调错误修复3、聊天模板问题 &#x1f4a1; 我们的问题修复有效吗&#xff1f;&#x1f999; Llama-fication&#x1f9a5; 动态 4 位量化&#x1f6e0;️ Finetuning Phi-4性能基准测试 本文翻译自&#xff1a;Phi-4 Finetuning …

多视图几何--对极几何--从0-1理解对极几何

1对极几何 1.1本质矩阵 1.1.1几何约束与推导 如图所示&#xff0c;物体点 P P P&#xff0c;图像点 p 1 , p 2 p_1,p_2 p1​,p2​,相机中心 o 1 , o 2 o_1,o_2 o1​,o2​五点共面的关系称为对极几何。 o 1 , o 2 o_1,o_2 o1​,o2​连线称为基线&#xff0c;其与图像的交点称为…

SpringBoot3.3.0集成Knife4j4.5.0实战

原SpringBoot2.7.18升级至3.3.0之后&#xff0c;Knife4j进行同步升级(Spring Boot 3 只支持OpenAPI3规范)&#xff0c;从原3.0.3(knife4j-spring-boot-starter)版本升级至4.5.0(knife4j-openapi3-jakarta-spring-boot-starter)&#xff0c;以下是升级过程与注意事项等 版本信息…

一招解决Pytorch GPU版本安装慢的问题

Pytorch是一个流行的深度学习框架&#xff0c;广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力&#xff0c;加速模型的训练和推理过程。接下来&#xff0c;我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…

Linux——system V共享内存

共享内存区是最快的IPC(进程内通信)形式&#xff0c;不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源&#xff0c;然后再进行通信&#xff0c;所以想要通过共享内存进行通信&#xff0c;那么第一步一定是让两个…

初识数组

数组的大概内容(自学)上篇 数组的创建和赋值 创建&#xff1a; int [] name new int [5]; int name [] new int [5]; int [] name {1,2.3,4,5}; 赋值&#xff1a; int [] score {1,2,3}; int [] score new int [] {1,2,3}; int [] score;//声明 score new int []…