java泛型知多少

Java 泛型了解么?

泛型是一种在编译时提供类型安全检查的机制,可以增加我们代码的可读性和安全性。泛型可以在编译时期对泛型参数进行校验来指定选入对象的类型,比如 ArrayList<Person> persons = new ArrayList<Person>() 这行代码就指明了该 ArrayList 对象只能传入 Person 对象,如果传入其他类型的对象就会报错。

什么是类型擦除?

类型擦除是Java泛型的一个重要概念,它指的是泛型信息只在编译阶段存在,在进入JVM之前,与类型相关的信息会被擦除掉,或者说被替换掉。这意味着泛型类(擦除后我们称之为原始类)和非泛型类在运行时实际上是相同的类。

Java 为什么要选择类型擦除这种实现方式?

类型擦除其实一直为我们程序员所诟病,给我们带了一些不必要的麻烦,那为什么还有选择类型擦除呢,其目的是为了向低版本兼容

类型擦除导致了哪些弊端?

泛型信息真的就没了吗?

并不是,泛型信息消失只是对于jvm而言,它会存储在。class文件中,这意味着我们可以通过反射去恢复这些泛型信息。

介绍⼀下常⽤的通配符?

问号通配符 ? 表示未知类型。通配符可用于参数、字段、局部变量和返回类型。可以近似的理解为泛型的泛型

  • 通配符匹配出来的泛型类型只能读取,不能写入。因为不知道这个容器放什么类型的数据,所以只能读取不能添加。

  • 最好不要在返回类型中使用通配符,因为确切知道方法返回的类型更安全。

public static void main(String[] args) {List<String> name = new ArrayList<String>();List<Integer> age = new ArrayList<Integer>();List<Number> number = new ArrayList<Number>();name.add("icon");age.add(18);number.add(314);getData(name);   // icongetData(age);    // 18getData(number); // 314
}// List<?>,在逻辑上是List<String>,List<Integer>等所有List<具体类型实参>的父类。
public static void getData(List<?> data) {System.out.println("data :" + data.get(0));
}

2.4. 上下边界限定

  • 上界限定通配符:<? extends E>,表示只接受E类型及其子类型。
  • 下界限定通配符:<? super E>, 表示只接受E类型及其父类型。
public static void main(String[] args) {List<String> name = new ArrayList<String>();List<Integer> age = new ArrayList<Integer>();List<Number> number = new ArrayList<Number>();name.add("icon");age.add(18);number.add(314);getUperNumber(name);   // 编译时报错,String类型不是Number的子类getUperNumber(age);    // 18getUperNumber(number); // 314
}public static void getData(List<?> data) {System.out.println("data :" + data.get(0));
}// List<? extends Number>,在逻辑上是List<Number>,List<Integer>等类的父类。
public static void getUperNumber(List<? extends Number> data) {System.out.println("data :" + data.get(0));
}

信息来源于:【每次一个技术点】泛型之类型擦除_哔哩哔哩_bilibili

讲解的非常好,up主的基本功非常好,一些细节上的问题,和语言设计时出现的缺点都讲的透透的!

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

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

相关文章

【设计模式】6、bridge 桥接模式

六、bridge 桥接模式 桥接设计模式 复杂逻辑拆分&#xff1a; 如果需要完成复杂的逻辑&#xff0c;可以把复杂逻辑设计为接口&#xff0c;内部再拆分为若干接口。这样复杂的逻辑会被拆分开&#xff0c;方便解耦。 例如&#xff1a;如果遥控器控制设备。可以遥控器设计为复杂…

销售经理(多继承/虚基类)

根据下图类之间的继承关系&#xff0c;以及main和输出定义&#xff0c;定义Staff类、Saleman类、Manager类和SaleManager类。 Staff类包含的数据成员有编号&#xff08;num)&#xff0c;姓名&#xff08;name)&#xff0c;基本工资&#xff08;basicSale&#xff09;。Saleman类…

pytorch中模型训练的学习率动态调整

pytorch动态调整学习率 背景手动设置自动衰减的学习率pytorch中的torch.optim.lr_schedulertorch.optim.lr_scheduler.ExponentialLRtorch.optim.lr_scheduler.StepLRtorch.optim.lr_scheduler.MultiStepLRtorch.optim.lr_scheduler.ReduceLROnPlateau 背景 在神经网络模型的训…

项目实践:贪吃蛇

引言 贪吃蛇作为一项经典的游戏&#xff0c;想必大家应该玩过。贪吃蛇所涉及的知识也不是很难&#xff0c;涉及到一些C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。这里我会介绍贪吃蛇的一些思路。以及源代码也会给大家放到文章末尾。 我们最终的…

优雅的最大公约数函数

记录一个极其优雅的最大公约数方法 // 递归形式 int gcd(int a, int b) {return b 0 ? a : gcd(b, a % b); }这里求最大公约数的方法使用了辗转相除法&#xff0c;只是比循环求最大公约数的方法更加优雅与简洁&#xff1a; // 迭代形式 int gcd(int a, int b) {while(b ! 0…

电大搜题微信公众号:福建开放大学学子的学习新篇章

在当今信息化时代&#xff0c;学习已经成为每个人不可或缺的一部分。福建开放大学&#xff0c;作为广播电视大学的重要一员&#xff0c;始终致力于为学生提供优质、灵活的教育资源。而电大搜题微信公众号的推出&#xff0c;更是为福建开放大学的学子们带来了全新的学习体验&…

【数学】常用等价无穷小及其注意事项示例

常用极限 lim ⁡ x → 0 sin ⁡ x x 1 \lim_{x \to 0} {\frac{\sin x}{x}}1 limx→0​xsinx​1 lim ⁡ x → 0 ( x 1 ) 1 x e \lim_{x \to 0} {(x1)^\frac{1}{x}}e limx→0​(x1)x1​e lim ⁡ n → ∞ a n 1 \lim_{n \to \infty} {\sqrt[n]{a}}1 limn→∞​na ​1 lim ⁡ n…

数组中两个字符串的最短距离---一题多解(贪心/二分)

点击跳转到题目 方法&#xff1a;贪心 / 二分 目录 贪心&#xff1a; 二分&#xff1a; 贪心&#xff1a; 要找出字符串数组中指定两个字符串的最小距离&#xff0c;即找出指定字符串对应下标之差的最小值 思考&#xff1a;如果是直接暴力求解&#xff0c;需要两层for循环…

VLOOKUP函数使用,为什么会报错“引用有问题”?

VLOOKUP函数的使用非常广泛&#xff0c;在excel2007版之后的软件中&#xff0c;使用VLOOKUP函数也许会遇到这样的场景&#xff0c;明明公式是没有问题的&#xff0c;公式还会报错“引用有问题”。 一、报错场景 输入公式后&#xff0c;回车确认&#xff0c;显示如下报错&…

xilinx cpri ip 开发记录

CPRI是无线通信里的一个标准协议&#xff0c;连接REC和RE的通信。 Xilinx有提供CPRI IP核。 区别于其它通信协议&#xff0c;如以太网等&#xff0c;CPRI是一个同步系统。 这就意味着两端的Master和Slave应当是同源时钟的&#xff0c;两边不存在频差&#xff0c;并且内部延时…

mysql 行锁,间隙锁,临键锁,锁范围和死锁实际例子实战

文章目录 背景锁介绍表默认数据测试唯一键记录存在事务1事务2结论 唯一键记录不存在事务1事务2结论 范围查询事务1事务2结论 普通索引存在事务1事务2总结 普通索引不存在事务A事务B结论 死锁例子 背景 想了解下RR事务如何防止幻读的&#xff0c;以及一个实际的死锁例子 锁介绍…

【计算机网络】面经

1.TCP&UDP 1.1TCP与UDP的区别 TCP传输数据稳定可靠&#xff0c;适用于对网络通信质量要求较高的场景。 面向连接。 每一条TCP有且只有两个端点&#xff0c;为一对一关系。 提供可靠交付。 全双工通信&#xff0c;全双工为即可传输又可接收。 面向字节流。 UDP的优点是速…

客户端动态降级系统

本文字数&#xff1a;4576字 预计阅读时间&#xff1a;20分钟 01 背景 无论是iOS还是Android系统的设备&#xff0c;在线上运行时受硬件、网络环境、代码质量等多方面因素影响&#xff0c;可能会导致性能问题&#xff0c;这一类问题有些在开发阶段是发现不了的。如何在线上始终…

微服务架构中的业务完整性验证设计

目录 1.概要设计 1.1 功能完整性与正确性验证 1.2 性能与响应速度验证 1.3 安全性验证 1.4 容错性与恢复能力验证 1.5 监控与日志记录验证 2.技术实现 2.1 测试策略与工具选择 2.2 身份验证与授权 2.3 数据一致性与事务管理 2.4 监控与日志 2.5 容错与恢复 2.6 数…

【linux kernel】 一文总结linux内核中的kobject、kset和ktype

文章目录 一、kobject、kset、ktype&#xff08;1-1&#xff09;kobject&#xff08;1-2&#xff09;ktype&#xff08;1-3&#xff09;kset 二、kobject操作API&#xff08;2-1&#xff09;kobject_init()&#xff08;2-2&#xff09;kobject_add()&#xff08;2-3&#xff09…

【命名空间详解】c++入门

目录 命名空间的定义 1.命名空间的正常定义 2.命名空间还可以嵌套 3. 命名空间可以合并 命名空间的使用 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 输入&#xff0c;输出 输出 命名空间的定义 …

linux命令ar使用说明

ar 建立或修改备存文件&#xff0c;或是从备存文件中抽取文件 补充说明 ar命令 是一个建立或修改备存文件&#xff0c;或是从备存文件中抽取文件的工具&#xff0c;ar可让您集合许多文件&#xff0c;成为单一的备存文件。在备存文件中&#xff0c;所有成员文件皆保有原来的属…

Java技术学习|Git

学习材料声明 尚硅谷Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; GIt Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有…

ARM_day8:基于iic总线的通信

一、IIC总线的基本概念&#xff1a; iic总线是一种带应答的同步的、串行、半双工的通信方式&#xff0c;支持一个主机对应多个从机。它有一根SCL&#xff08;时钟线&#xff09;和一根SDA&#xff08;数据线&#xff09;组成&#xff0c;由于只有一根数据线&#xff0c;所以它是…

英伟达大跳水!一夜暴跌10%,市值蒸发2000亿

相信大家已经在各大社交平台上看到了&#xff0c;英伟达一夜蒸发了2000亿美元&#xff01; GPT-3.5研究测试&#xff1a; https://hujiaoai.cn GPT-4研究测试&#xff1a; https://higpt4.cn Claude-3研究测试&#xff08;全面吊打GPT-4&#xff09;&#xff1a; https://hic…