java的泛型擦除啷个回事罗

泛型擦除啷个回事罗🚕

  • 泛型擦除
    • List中的泛型擦除(例子)
      • 反编译

岁暮阴阳催短景,天涯霜雪霁寒宵。——唐代王之涣《登鹳雀楼》

泛型擦除

当我们通过get方法获取泛型是Integer的List中的第一个元素时,返回值会被自动转换为Integer类型, Java的自动类型转换的过程, 为什么泛型擦除了之后还能获取的到原来的类型

首先,我们要了解一下Java泛型和类型擦除的概念。泛型是Java中一种泛化类型的机制,它允许我们在类、接口和方法中定义类型参数,使得代码可以更灵活地复用。在编译期间,泛型信息会被擦除,即类型参数会被替换为其边界类型(如果有边界类型)或Object类型。类型擦除主要是为了保持向后兼容性,因为在Java泛型引入之前,已经存在的代码都是使用原始类型的。


List中的泛型擦除(例子)

现在我们来看一下,当我们通过get方法获取泛型为IntegerList中的第一个元素时,为什么返回值会被自动转换为Integer类型。

假设我们有一个泛型为IntegerList,代码如下:


List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
intList.add(3);

当我们调用get方法获取第一个元素时,这里的过程分为两个阶段:编译时和运行时。

  1. 编译时:泛型信息被擦除,get方法的返回类型变为Object。编译器会在编译期间检查类型安全,以确保intList只包含Integer类型的元素。此外,编译器还会在需要的地方插入类型转换代码。在这个例子中,我们获取到的元素的类型是Object,但是编译器知道它实际上是一个Integer,所以会在适当的地方插入一个类型转换,将Object类型转换为Integer类型。

Integer firstElement = (Integer) intList.get(0);

  1. 运行时:当代码运行时,类型擦除已经发生,所以get方法返回的是一个Object类型的对象。但由于编译器在编译期间已经插入了类型转换代码,所以这个Object类型的对象会被自动转换为Integer类型。

总结一下,虽然泛型信息在编译时被擦除,但编译器会在编译期间检查类型安全,并在需要的地方插入类型转换代码。这样,在运行时,虽然泛型信息已经被擦除,但仍然可以获取到原来的类型,因为类型转换是在编译期间自动插入的。


反编译

验证一下:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
        List<Integer> intList = new ArrayList<>();
        intList.add(1);
        intList.add(2);
        intList.add(3);
        Integer firstElement = intList.get(0);
        System.out.println("firstElement: " + firstElement);
    }
}

反编译:

javap -c -p -v Main.class

public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String Hello world!
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: new           #5                  // class java/util/ArrayList
        11: dup
        12: invokespecial #6                  // Method java/util/ArrayList."<init>":()V
        15: astore_1
        16: aload_1
        17: iconst_1
        18: invokestatic  #7                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        21: invokeinterface #8,  2            // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
        26: pop
        27: aload_1
        28: iconst_2
        29: invokestatic  #7                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        32: invokeinterface #8,  2            // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
        37: pop
        38: aload_1
        39: iconst_3
        40: invokestatic  #7                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        43: invokeinterface #8,  2            // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
        48: pop
        49: aload_1
        50: iconst_0
        51: invokeinterface #9,  2            // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
        56: checkcast     #10                 // class java/lang/Integer
        59: astore_2
        60: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        63: new           #11                 // class java/lang/StringBuilder
        66: dup
        67: invokespecial #12                 // Method java/lang/StringBuilder."<init>":()V
        70: ldc           #13                 // String firstElement:
        72: invokevirtual #14                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        75: aload_2
        76: invokevirtual #15                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
        79: invokevirtual #16                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        82: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        85: return

我们看到这两行

51: invokeinterface #9, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
56: checkcast #10 // class java/lang/Integer

获取其实是一个object, 编译器自动帮我们推测了类型, 并且自动帮我们加上了强制类型转换

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

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

相关文章

户外徒步用什么耳机好?户外运动耳机推荐

作为一个徒步爱好者&#xff0c;在长时间的户外行走的途中自然会准备一个耳机来陪伴我。市面上各种运动型耳机层出不穷&#xff0c;价格也从几十到上千不等。但是喜爱的运动项目不同对运动耳机的需求也不一样。今天我们就来盘带点一下市面上各产品的性能参数&#xff0c;哪一款…

如何理解文件描述符和文件指针,两者的区别和联系?

下面是一些预备的知识&#xff1a; 我们先来回顾一下这张图 如果你对此图并不了解&#xff0c;甚至完全都知道这张图&#xff0c;那么下面的内容了解起来可能并不容易。 第一&#xff0c;首先我们要明确的认识一点&#xff0c;文件流指针是各种语言对系统调用接口的封装&…

代码随想录算法训练营第四十二天 | 416. 分割等和子集

背包问题之01背包问题基础&#xff1a; 视频讲解 &#xff08;一&#xff09;常见要求&#xff1a; 有n件物品&#xff0c;每个物品只有一个&#xff0c;和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&a…

【操作系统】模块六 :文件系统 (Linux文件目录 | 文件系统 | B树 B+树 |分布式文件系统)

文章目录【操作系统】模块六 &#xff1a;文件系统Linux的文件目录分区结构挂载目录结构/usr&#xff08;Unix System Resource&#xff09; 包含系统需要的资源文件&#xff0c;通常应用程序会把后来安装的可执行文件 也放到这个目录下&#xff0c;比如说文件系统底层设计 FAT…

树莓派学习笔记(十二)Linux驱动认知及编译加载驱动

文章目录一、Linux驱动认知二、内核空间1、如何找到相关的驱动2、主设备号和次设备号3、驱动链表&#xff1a;管理所有设备的驱动4、驱动插入链表的顺序由设备号检索5、驱动代码的开发三、驱动编写、编译、测试四、驱动阶段性总结一、Linux驱动认知 Linux驱动分为用户空间、内…

TCP网络事件模型的封装2.0

TCP网络事件模型的封装2.0 最近学习了TCP网络模型的封装&#xff0c;其中运用的封装技术个人感觉有点绕 在反复读代码、做思维导图下初步理解了这套封装模型&#xff0c;不禁感叹原来代码还能这样写&#xff1f;神奇&#xff01; 为此将源码分享出来并将流程图画出&#xff…

FITC-PEG-SH,荧光素-聚乙二醇-巯基的用途:用于修饰氨基酸,蛋白质等

FITC-PEG-SH 荧光素聚乙二醇巯基 英文名称&#xff1a;Fluorescein (polyethylene glycol)Thiol 中文名称&#xff1a;荧光素聚乙二醇巯基 外观: 黄色液体、半固体或固体&#xff0c;取决于分子量。 溶剂&#xff1a;溶于水等其他常规性有机溶剂 激光/发射波长&#xff1a…

ChatGPT使用案例之自然语言处理

ChatGPT使用案例之自然语言处理 自然语言处理被誉为“人工智能皇冠上的明珠”&#xff0c;这句话就已经说明了自然语言处理在整个人工智能体系中的重要性&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是一种涉及计算机和人类自…

联想小新 青春版-14笔记本电脑重装系统教程

在使用笔记本电脑的过程中&#xff0c;我们难免会遇到一些问题&#xff0c;比如系统崩溃、病毒感染等等。这时候&#xff0c;我们就需要重装系统来解决这些问题。而联想小新 青春版-14笔记本电脑的系统重装方法&#xff0c;就是我们需要掌握的技能之一。本文将详细介绍如何重装…

python怎么自学

其实0基础选择python学习入行的不在少数&#xff0c;Python近段时间一直涨势迅猛&#xff0c;在各大编程排行榜中崭露头角&#xff0c;得益于它多功能性和简单易上手的特性&#xff0c;让它可以在很多不同的工作中发挥重大作用。 正因如此&#xff0c;目前几乎所有大中型互联网…

element-plus官网访问太慢 下载文档到本地部署 实现快速查阅

我只是吐槽下 element基于githup pages这个部署文档地址 本来访问就慢,然后吧这个文档看的人还很多,导致更慢了 经常卡半天才出来文档地址 文档地址: https://github.com/element-plus/element-plus/tree/gh-pages 文档的地址(你直接下载下来 想跑起来的话可能需要更改文档的路…

【C++】IO流 + 空间配置器(了解)

文章目录&#x1f4d6; 前言1. IO流1.1 C语言的输入和输出&#xff1a;1.2 流的概念及特性&#xff1a;1.3 自定义类型隐式类型转换&#xff1a;1.4 在线OJ中的输入和输出&#xff1a;1.5 CIO流对文件的操作&#xff1a;1.6 stringstream介绍&#xff1a;2. 空间配置器2.1 什么…

安科瑞智能照明控制系统在工厂的应用

安科瑞 安科瑞 李亚娜 1&#xff5c;概述 安科瑞智能照明控制解决方案ALIBUS&#xff08;Acrel Lighting intelligent Bus&#xff09;基于成熟的RS485通讯控制技术&#xff0c;同时创新地引入了载波侦听和冲突碰撞检测机制&#xff0c;多机间实现了实时双向通讯&#xff0c;线…

Java设计模式-9 、策略模式

策略模式 策略模式&#xff08;Strategy Pattern&#xff09;属于对象的⾏为模式。其⽤意是针对⼀组算 法&#xff0c;将每⼀个算法封装到具有共同接⼝的独⽴的类中&#xff0c;从⽽使得它们可以 相互替换。策略模式使得算法可以在不影响到客户端的情况下发⽣变化。 其主要⽬的…

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用

植被是陆地生态系统中最重要的组分之一&#xff0c;也是对气候变化最敏感的组分&#xff0c;其在全球变化过程中起着重要作用&#xff0c;能够指示自然环境中的大气、水、土壤等成分的变化&#xff0c;其年际和季节性变化可以作为地球气候变化的重要指标。此外&#xff0c;由于…

手敲Mybatis(八)-参数处理器

前言在之前的章节里边&#xff0c;类PreparedStatementHandler我们还没有处理在执行Sql时的参数&#xff0c;目前是硬编码写死存储的&#xff0c;如&#xff1a;ps.setLong()&#xff0c;这里就只能处理long类型的数据因为写死了&#xff0c;我们需要处理下让它支持设置不同的数…

【Linux 网络编程4】网络层--UDP/TCP协议,3次握手4次挥手、粘包问题等

netstat命令-n.拒绝显示别名&#xff0c;能显示数字的全部转化成数字(IPPORT)-l 仅列出有在 Listen (监听) 的服务的状态-p 显示建立相关链接的程序名&#xff08;pid&#xff09;-t 仅显示tcp相关选项-u 仅显示udp相关选项 2.UDP协议2.1.全双工和半双工的区别全双工&#xff1…

了解Session、LocatStorage、Cache-Control、ETag区别

一、cookie与session有什么区别&#xff1f; 1. 由于HTTP协议是无状态的协议&#xff0c;所以服务端需要记录用户的状态时&#xff0c;就需要用某种机制来识具体的用户&#xff0c;这个机制就是Session.典型的场景比如购物车&#xff0c;当你点击下单按钮时&#xff0c;由于HT…

SpringBoot学习笔记(4)-分析 SpringBoot 底层机制

文章目录4. 分析 SpringBoot 底层机制4.1 Tomcat启动分析4.2 创建Spring 容器4.3 将Tomcat 和 Spring 容器关联&#xff0c;并启动 Spring 容器4.4 扩展-debug查看 ac.refresh()4. 分析 SpringBoot 底层机制 【Tomcat 启动分析 Spring 容器初始化Tomcat 如何关联 Spring 容器…

微软分享修复WinRE BitLocker绕过漏洞的脚本

微软发布了一个脚本&#xff0c;可以更轻松地修补 Windows 恢复环境 (WinRE) 中的 BitLocker 绕过安全漏洞。 此 PowerShell 脚本 (KB5025175) 简化了保护 WinRE 映像以防止试图利用CVE-2022-41099漏洞的过程&#xff0c;该漏洞使攻击者能够绕过 BitLocker 设备加密功能系统存…
推荐文章