什么是泛型类型擦除?

news/2025/2/24 20:18:01/文章来源:https://www.cnblogs.com/aibi1/p/18734777

目录
  • 概念
  • 原理
  • 代码示例
  • 代码解释
  • 类型擦除带来的影响

泛型类型擦除(Type Erasure)是 Java 泛型实现的一种机制,它在编译时期将泛型类型信息移除,使得泛型代码在运行时与非泛型代码具有相同的表现形式。以下从概念、原理、影响、示例等方面详细介绍泛型类型擦除。

概念

Java 泛型是在 JDK 5.0 引入的,目的是在编译阶段提供类型检查,增强代码的安全性和可读性。但 Java 为了保持与旧版本代码的兼容性,采用了类型擦除的方式来实现泛型。简单来说,类型擦除就是在编译过程中,将泛型类型参数(如 <T>)替换为其边界类型(如果有边界)或 Object 类型,然后在必要的地方插入类型转换代码,使得泛型代码在运行时与普通代码具有相同的字节码。

原理

  • 无界类型参数:如果泛型类型参数没有指定边界,在类型擦除时会被替换为 Object 类型。例如,List<T> 会被擦除为 List<Object>
  • 有界类型参数:如果泛型类型参数指定了边界,如 <T extends Number>,则会被擦除为其边界类型 Number

代码示例

import java.util.ArrayList;
import java.util.List;public class TypeErasureExample {public static void main(String[] args) {// 创建一个存储 Integer 类型的列表List<Integer> integerList = new ArrayList<>();// 创建一个存储 String 类型的列表List<String> stringList = new ArrayList<>();// 检查两个列表的运行时类型System.out.println(integerList.getClass() == stringList.getClass()); // 输出 true// 类型擦除后,在编译时进行类型检查,运行时进行类型转换integerList.add(10);// 编译时检查通过,运行时会进行类型转换Integer num = integerList.get(0); }
}

代码解释

  • 运行时类型相同:在上述代码中,List<Integer>List<String> 在运行时的类型都是 ArrayList,因为类型擦除后泛型信息被移除了,所以 integerList.getClass() == stringList.getClass() 的结果为 true
  • 编译时类型检查和运行时类型转换:在编译阶段,编译器会对泛型代码进行类型检查,确保只有符合泛型类型参数的元素才能被添加到列表中。在运行时,由于类型擦除,列表实际上存储的是 Object 类型的元素,当从列表中获取元素时,会进行隐式的类型转换。

类型擦除带来的影响

  • 无法在运行时获取泛型类型信息:由于类型擦除,在运行时无法直接获取泛型的具体类型参数。例如,不能在运行时通过反射获取 List<Integer> 中的 Integer 类型。
import java.util.ArrayList;
import java.util.List;public class GenericTypeInfo {public static void main(String[] args) {List<Integer> list = new ArrayList<>();// 无法在运行时获取泛型的具体类型参数// 这里输出的是 java.util.ArrayList,而不是 List<Integer>System.out.println(list.getClass().getName()); }
}
  • 不能使用基本数据类型作为泛型类型参数:因为类型擦除后泛型类型参数会被替换为 Object 或边界类型,而基本数据类型不能直接转换为 Object,所以只能使用基本数据类型的包装类作为泛型类型参数。例如,不能使用 List<int>,而要使用 List<Integer>
  • 泛型数组的创建受限:不能直接创建泛型数组,如 new List<String>[10] 是不允许的,因为类型擦除会导致数组元素类型的信息丢失,可能会引发运行时的 ArrayStoreException 异常。但可以创建通配符类型的数组或使用 ArrayList 等集合来替代。

虽然类型擦除有一些限制,但它使得 Java 能够在保持向后兼容性的同时引入泛型特性,为开发者提供了更安全、更便捷的编程方式。

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

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

相关文章

使用Go复刻skiplist核心功能

0、引言 正好做LC每日一题要求实现一个跳表,于是学习了redis的扩展skiplist,并使用Go进行复刻学习。学习参考了文章:Redis内部数据结构详解(6)——skiplist - 铁蕾的个人博客 因为作者能力有限,本文只是对跳表的核心功能:创建节点与跳表、插入节点、删除节点、获取节点ran…

BUUCTF-RE-[ACTF新生赛2020]usualCrypt

又他妈的是新生赛,我都不是新生了还天天被折磨。 首先查壳分析,然后反编译程序,可以看到程序逻辑还是比较简单的我们进行一下整理和重命名,可以得到完整的程序逻辑: int __cdecl main(int argc, const char **argv, const char **envp) {int v3; // esichar v5[15]; // [e…

探秘Transformer系列之(6)--- token

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(6)--- token 0x00 概述 语言是人类特有的概念。作为一个抽象符号,…

leetcode hot 10

解题思路:滑动窗口问题,关键在于记录之前出现过的字符,当遍历过程中碰到之前出现的,就从之前出现的下一个作为start,实时比较当前值和最长值并赋值,最后返回最长值。java可以采用hashmap记录出现过的字符,value保存它的位置+1的值,作为出现重复的字符的时候的start的参考…

摆脱 Deepseek 服务器繁忙,手把手教你接入火山引擎 API(超详细版)

大家好,我是亿舟。大家最近应该都被 Deepseek 刷屏了,不少人想去试试 Deepseek 有多厉害,但是去到官网,没问几个问题,就弹出来“服务器繁忙,稍后再试”。今天教给大家一个方法,可以在 Cherry Studio 配合上火山引擎的 API,享受满血版、联网搜索、思考不截断的 Deepseek…

【Azure Developer】编写Python SDK代码实现从China Azure中VM Disk中创建磁盘快照Snapshot

问题描述 需要为中国区微软云(China Azure)中的虚拟机磁盘(VM Disk)创建快照, 官方文档中只有az cli(az snapshot create)脚本,并没有介绍使用Python SDK的办法,需要编写代码来实现快照的创建。问题解答 Azure Python SDK 的 Snapshot Class文档提供了参数说明,如 location…

AutoEval

目前文章的共性通过探究 其他方法(多任务学习器)得到的分类器与带原始标签的合成数据集分类器 的相关关系。得出一个可以应用在无标签且含有分布偏移的真实世界数据上,分类效果较好的分类器。【Frechet distance(Auto-eval),Rotation Prediction(Weijian Deng, Stephen …

开学测验——仓库管理系统

以下是项目结构:登录界面:输入不同用户名进入不同角色的主页面管理员:仓库工作人员:

【窃贼】- 2025.2.24

下图为《Balatro》中的一张小丑牌:【窃贼】窃贼是小丑牌中一张独一无二的小丑,其效果为 \(+3\) 出牌次数并失去所有弃牌次数。其能力相当强大,因为 \(+3\) 出牌次数涵盖了非常多的方面。首先 \(+3\) 出牌次数显然可以拉高分数,提升幅度在绝大多数情况下至少带来 \(\times 1…

2025-2 好题

2025-2 好题 目录2025-2 好题UOJ Round 29 B - 数字生命P10063 [SNOI2024] 平方数AGC070C - No StreakAGC070B - Odd Namoriリテラチュアブルーアーカイブ UOJ Round 29 B - 数字生命 首先想到差分,差分后是正的就看成一些起点,负的就看成是一些终点 然后题目就相当于要对每一…

智算超凡| 触想携手DeepSeek,探索工业+AI应用新模式!

近年来,AI赋能工业场景的应用趋势越发明显,尤其DeepSeek大模型凭借强大的多场景理解与生成能力横空出世,瞬间点燃了“工业+AI”应用的无限遐想。一、DeepSeek火出圈,工业AI加速部署以此为契机,触想于日前启动了DeepSeek大模型在其工业一体机、工控机等产品上的多轮对接与本…