当前位置: 首页 > news >正文

【八股】泛型

泛型存在的意义?

为了使相同的代码适用于多种数据类型,也就是代码复用。

参数类型上下限限制

  1. <?> 无限制
  2. <? extends E> 声明了类型的上界,表示参数类型可以是他或他的子类。
  3. <? super E> 声明了类型的下界,表示参数类型可以是他或他的父类。

类型擦除

Java泛型这个特性是JDK 1.5才引入的,所以为了兼容之前没有泛型的版本,java的泛型策略是,Java在语法上支持泛型,但在编译阶段会进行类型擦除
类型擦除,就是根据把原类型替换为其原生类型,如果没有限制就替换为Object,如果有上下界限定就替换为原类型的最上界(比如 <T extends number>的类型参数T就被替换为Number,<T super Number>的类型参数T就被替换为Object

拓展:
这个类型擦除也可以引出另一个问题, 为什么要有包装类? 因为基本类型不能作为泛型参数,只有引用类型能作为泛型参数。为什么基本类型不能作为泛型参数? 因为java的泛型策略是,Java在语法上支持泛型,但在编译阶段会进行类型擦除

以下一段代码可以证明Java泛型的类型擦除:

public class Main {public static void main(String[] args) throws Exception {ArrayList<Integer> list = new ArrayList<Integer>();list.add(1);  //这样调用 add 方法只能存储整形,因为泛型类型的实例为 Integerlist.getClass().getMethod("add", Object.class).invoke(list, "asd");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}

在这里插入图片描述
定义了一个泛型类型Integer为ArrayList,但当我们利用反射调用ArrayList的add()方法时,却可以存储字符串,说明Integer在编译之后被擦除掉了,只保留了原始类型。原始类型就是擦除了泛型信息后,最后在字节码中的真正类型。

类型擦除的流程

Java编译器是先检查泛型的类型,然后进行类型擦除,最后编译。

public static void main(String[] args) throws Exception {ArrayList<String> list = new ArrayList<String>();list.add("123");list.add(123);//编译错误  java: 不兼容的类型: int无法转换为java.lang.String
}

这段代码编译会报错。说明检查在编译之前,如果检查在编译之后,编译之后变成原始类型Object了,那就不会报错了。
对谁检查?检查是对引用调用的方法进行类型检查,比如上面这段代码就是对list调用的方法里面的参数进行类型检查。

相关文章:

  • 深度学习pytorch——激活函数损失函数(持续更新)
  • SpringBoot+ElasticSearch实现文档内容抽取、高亮分词、全文检索
  • 【系统架构师】-第12章-信息系统架构
  • Python基础中易错点分享
  • UE4_旋转节点总结一
  • ubuntu16 apt安装程序锁死解决
  • opencv 十九 python下实现多线程间rtsp直播流的复用
  • Games104 听后笔记
  • 利用python搭建临时文件传输服务
  • 《自动机理论、语言和计算导论》阅读笔记:p5-p27
  • Microsoft Word 快捷键 (keyboard shortcut - hotkey)
  • C# 高级文件操作与异步编程探索(初步)
  • 计算机组成原理 — 指令系统
  • AI颠覆,倒计时
  • Wagtail-基于Python Django的内容管理系统CMS实现公网访问
  • 【React系列】如何构建React应用程序
  • Android 控件背景颜色处理
  • Golang-长连接-状态推送
  • Intervention/image 图片处理扩展包的安装和使用
  • Java IO学习笔记一
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • java中具有继承关系的类及其对象初始化顺序
  • node入门
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 关于extract.autodesk.io的一些说明
  • 关于字符编码你应该知道的事情
  • 简单易用的leetcode开发测试工具(npm)
  • 利用jquery编写加法运算验证码
  • 浅谈web中前端模板引擎的使用
  • 通信类
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 因为阿里,他们成了“杭漂”
  • 正则学习笔记
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 阿里云重庆大学大数据训练营落地分享
  • ​configparser --- 配置文件解析器​
  • ​iOS实时查看App运行日志
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #宝哥教你#查看jquery绑定的事件函数
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C++)八皇后问题
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (四)c52学习之旅-流水LED灯
  • (算法)Game
  • (状压dp)uva 10817 Headmaster's Headache
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .“空心村”成因分析及解决对策122344
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Core 中间件验签
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net 垃圾回收机制原理(二)