泛型擦除(Generic erase)(内含教学视频+源代码)

news2025/7/12 23:32:55

泛型擦除(Generic erase)(内含教学视频+源代码)

教学视频+源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87473560

    源代码中使用的泛型,在经过编辑后,代码中就看不到泛型,也就是所谓的泛型擦除
    泛型擦除不是泛型丢失了,而是在编译后的字节码文件中使用单独的标识来存储泛型了。

    为什么会出现泛型擦除,主要是为了编译器的兼容性。
    因为在jdk5之前是没有泛型的,jdk5之后出现了泛型。
    为了编译器的兼容性,在编辑代码的时候就将泛型擦除了,这样就和之前没有泛型的时候编译一样了。
    Java代码编译前会进行代码校验。代码能够通过校验,说明代码语法是没有问题的。所以编译的时候可以擦除泛型。

比如:

ArrayList<String> list = new ArrayList<>();
list.add("java");
ist.add("hello");

以上代码可以校验通过,说明集合中的元素一定是符合泛型的类型的,所以此时编译擦除泛型不受影响

ArrayList list = new ArrayList();
list.add("java");
list.add("hello");
import java.util.ArrayList;
import java.util.Arrays;

/**
 * 泛型擦除(Generic erase):
 *
 *      源代码中使用的泛型,在经过编辑后,代码中就看不到泛型,也就是所谓的泛型擦除
 *
 *      泛型擦除不是泛型丢失了,而是在编译后的字节码文件中使用单独的标识来存储泛型了。
 *
 *      为什么会出现泛型擦除,主要是为了编译器的兼容性。
 *      因为在jdk5之前是没有泛型的,jdk5之后出现了泛型。
 *      为了编译器的兼容性,在编辑代码的时候就将泛型擦除了,这样就和之前没有泛型的时候编译一样了。
 *      Java代码编译前会进行代码校验。代码能够通过校验,说明代码语法是没有问题的。所以编译的时候可以擦除泛型。
 *      比如:
 *          ArrayList<String> list = new ArrayList<>();
 *          list.add("java");
 *          list.add("hello");
 *      以上代码可以校验通过,说明集合中的元素一定是符合泛型的类型的,所以此时编译擦除泛型不受影响
 *          ArrayList list = new ArrayList();
 *  *       list.add("java");
 *  *       list.add("hello");
 *
 *
 */
public class GenericErasure {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("java");
        list.add("hello");
        System.out.println(list);
    }
}

找到它的字节码文件
在这里插入图片描述
打开反编译工具XJad
在这里插入图片描述
将字节码文件拖拽进反编译工具XJad中
在这里插入图片描述
通过GenericErasure.class字节码文件被XJad反编译工具反编译后,就没有泛型了,说明泛型被擦除了,但是在字节码的其它信息里存的有。

鼠标右击这个GenericErasure.class字节码文件,打开它所在的目录

在这里插入图片描述
在这里插入图片描述
在地址栏上输入cmd,然后按回车
在这里插入图片描述
输入javap -v GenericErasure.class
javap -v: class字节码文件中除了包-c参数包含的内容外,还会输出行号、局部变量表信息、常量池等信息;
在这里插入图片描述
在这里插入图片描述
说明:在字节码文件中 本地变量类型表格LocalVariableTypeTable中 是存的有泛型的类型。泛型的类型是在的,没有丢,只是擦除了。

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

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

相关文章

PX4之飞行控制框架

PX4的飞行控制程序通过模块来实现&#xff0c;与飞控相关的模块主要有commander&#xff0c;navigator&#xff0c;pos_control&#xff0c;att_control这几个&#xff0c;分别可以在src/modules目录中找到。 commander - 指令/事件处理模块&#xff0c;处理指令、遥控器输入和…

新C++(9):谈谈,翻转那些事儿

"相信羁绊&#xff0c;相信微光&#xff0c;相信一切无常。"一、AVL树翻转那些事儿(1)什么是AVL树&#xff1f;在计算机科学中&#xff0c;AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1&#xff0c;所以它也被称为高度平衡树。…

网上插画教学哪家质量好,汇总5大插画培训班

网上插画教学哪家质量好&#xff1f;给大家梳理了国内5家专业的插画师培训班&#xff0c;最新五大插画班排行榜&#xff0c;各有优势和特色&#xff01; 一&#xff1a;国内知名插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画、古风插…

Tencent OS下逻辑卷(LVM)创建和扩容

测试环境是一个虚拟机&#xff0c;原配置1个虚拟盘。 创建4个虚拟盘&#xff0c;每盘2G并挂载在虚拟主机上&#xff0c;启动虚拟主机开始测试。 LVM英文是Logical Volume Manager&#xff0c;直接翻译为逻辑卷管理。 这种磁盘管理模式比较灵活&#xff0c;在磁盘空间不足的时…

深入浅出C++ ——容器适配器

文章目录一、容器适配器二、deque类简介1. deque的原理2. deque迭代器3. deque的优点和缺陷4. 为什么选择deque作为stack和queue的底层默认容器一、容器适配器 适配器的概念 适配器是STL六大核心组件之一&#xff0c;它是一种设计模式&#xff0c;该种模式是将一个类的接口转换…

大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s &#x1f4da;️Reference: IoT 边缘计算系列文章 HashiCorp 解决方案 - Nomad Docker 简介 Nomad: 一个简单而灵活的调度器和编排器&#xff0c;…

网络工程课(二)

ensp配置vlan 一、配置计算机ip地址和子网掩码 二、配置交换机LSW1 system-view [Huawei]sysname SW1 [SW1]vlan batch 10 20 [SW1]interface Ethernet0/0/1 [SW1-Ethernet0/0/1]port link-type access 将接口设为access接口 [SW1-Ethernet0/0/1]port default vlan 10 [SW1-E…

【MyBatis】源码学习 04 - 从 MapperMethod 简单分析一条 SQL 的映射操作流程

文章目录前言参考目录学习笔记1、测试代码说明2、binding 包的主要功能3、获取 Mapper 接口实例过程4、SQL 语句执行流程4.1、方法调用器4.2、MapperMethod 绑定方法4.2.1、SqlCommand4.2.2、MethodSignature4.3、MapperMethod#execute前言 本文内容对应的是书本第 13 章的内容…

【亲测2022年】网络工程师被问最多的面试笔试题

嗨罗~大家好久不见&#xff0c;主要是薄荷呢主业还是比较繁忙的啦&#xff0c;之前发了一个面试题大家都很喜欢&#xff0c;非常感谢各位大佬对薄荷的喜爱&#xff0c;嘻嘻然后呢~薄荷调研了身边的朋友和同事&#xff0c;发现我们之前去面试&#xff0c;写的面试题有很多共同的…

C++ Effictive 第6章 继承与面向对象设计 笔记

继承意味着"is-a"。如果B继承自A&#xff0c;那么B is-a A。 子类声明与父类函数同名的函数时&#xff0c;父类函数会被遮掩。 使用using Base::func(args...)&#xff1b;父类所有func的重载函数都在子类中被声明。此举下&#xff0c;如果子类函数与父类函数参数也一…

不要对chatgpt过度反思 第一部分

最近一段时间&#xff0c;chatgpt很热&#xff0c;随意翻一些文章或视频&#xff0c;一些非常整齐一致的怪论&#xff0c;时不时都会冒出来。 为什么这种革命性创新又出现美国&#xff1f; 为什么我国互联网只会电商&#xff0c;没有创新&#xff1f; 为什么我们做不出来&…

列表推导式_Python教程

内容摘要 Python中存在一种特殊的表达式&#xff0c;名为推导式&#xff0c;它的作用是将一种数据结构作为输入&#xff0c;再经过过滤计算等处理&#xff0c;最后输出另一种数据结构。根据数据结构的不同会被分为列表推导式、 文章正文 Python中存在一种特殊的表达式&#x…

股票、指数、快照、逐笔... 不同行情数据源的实时关联分析应用

在进行数据分析时经常需要对多个不同的数据源进行关联操作&#xff0c;因此在各类数据库的 SQL 语言中均包含了丰富的 join 语句&#xff0c;以支持批计算中的多种关联操作。 DolphinDB 不仅通过 join 语法支持了对于全量历史数据的关联处理&#xff0c;而且在要求低延时的实时…

Qt信号与槽使用方法总结

前言 在图形界面编程中QT是为首选&#xff0c;组件之间如何实现通信是核心的技术内容。Qt 使用了信号与槽的机制&#xff0c;非常的高效、简单、易学&#xff0c;方便开发者的使用。本文详细的介绍了Qt 当中信号与槽的概念&#xff0c;并演示了各种信号与槽的连接方式。 什么…

你知道 GO 中的 协程可以无止境的开吗?

GO语言天生高并发的语言&#xff0c;那么是不是使用 go 开辟协程越多越好的&#xff0c;那么在 go 里面&#xff0c;协程是不是可以开无限多个呢&#xff1f; 那么我们就一起来看看尝试写写 demo 吧 尝试开辟尽可能多的 协程 写一个 demo &#xff0c;循环开 1 << 31 …

自由变化,功能增强,适配优化—V6.0.2版本发布

本次更新&#xff1a;经过两个月的细节打磨&#xff0c; V6.0.2版本发布&#xff0c;自由变化&#xff0c;功能增强&#xff0c;适配优化&#xff1b;新版本增加了超级弹窗&#xff0c;可以多窗口并存&#xff1b;增加了编号组件&#xff0c;可以调用编号组件库&#xff0c;自动…

Artiifact分析HSV数据

Artiifact分析HSV数据1 下载Artiifact分析工具2 安装软件后打开软件3 分析1 Extract IBIS from ECG data2 Detect and process artifact in IBI data3 Analse HRVARTiiFACT&#xff0c;这是一种用于处理心电图和 IBI 数据的软件工具。图形用户界面中提供了自动和手动伪影检测和…

JavaEE|TCP/IP协议栈之TCP协议端格式详解

文章目录一、对TCP协议的感性认识简介特点二、TCP的报文结构概览16位端口号和16位目的端口号32位序号和32位确认序号4位首部长度保留位&#xff08;6位&#xff09;6个标志位16位窗口大小16位校验和16位紧急指针40位头部选项&#xff08;option&#xff09;参考一、对TCP协议的…

【新品发布】三颗国产新“芯”硬核亮相——1颗电机驱动IC+2颗电源管理IC

拓尔“芯”常态&#xff0c;性能为王创新进取永不止步&#xff01;自2023年新品发布会1月场发布5款重磅新品后&#xff0c;伴着春律&#xff0c;2月场它来了&#xff01; 2023年2月20日晚&#xff0c;拓尔微线上发布电机驱动芯片TMI8723及两颗电源管理芯片TMI7205B、TMI5122D8…

初识SSTI

SSTI概念SSTI就是服务器端模板注入&#xff08;Server-Side Template Injection&#xff09;&#xff0c;实际上也是一种注入漏洞&#xff1b;可以类比于SQL注入&#xff0c;实际上这两者的基本思想是一致的&#xff1b;SSTI也是获取了一个输入&#xff0c;然后在后端的渲染处理…