Java类型擦除

article/2025/10/28 21:22:51

什么是类型擦除

Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。

问1:Java类型擦除是什么过程出现的?

Java泛型编译过程会擦除掉泛型信息。

    /*** 比较两个ArrayList的类型比较* 1) 第一个ArrayList是ArrayList<String>,第二个是ArrayList<Integer>*  实际运行时获取的类型都是java.util.ArrayList** @author zhouronghua* @time 2022/1/10 4:15 下午*/@Testpublic void testGenericTypeCompare() {System.out.println("测试泛型类比较");// 第一个是字符串ArrayListArrayList<String> list1 = new ArrayList<>();list1.add("One");list1.add("Two");// 第二个是整形ArrayListArrayList<Integer> list2 = new ArrayList<>();list2.add(100);list2.add(200);// 比较两个ArrayList类型System.out.println("ArrayList Type compare: " + (list1.getClass() == list2.getClass()));// java.util.ArrayListSystem.out.println("ArrayList<String> Type: " + list1.getClass());// java.util.ArrayListSystem.out.println("ArrayList<Integer> Type: " + list2.getClass());}

编译后的类型进行了擦除,都是ArrayList,限定类型都已经擦除了。

我们通过查看字节码,就可以清晰的看到ArrayList的类型限定擦除了。添加元素的时候,

对象类型使用的是Object

2.类型擦除后保留的原始类型 

原始类型 就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型,无论何时定义一个泛型,相应的原始类型都会被自动提供,类型变量擦除,并使用其限定类型(无限定的变量用Object)替换。

问2:是否能够通过instanceof查询ArrayList的类限定类型(泛型信息)?

不能。

2.Java协变和逆变

因为泛型类型编译过程中会发生类型擦除,那么怎么将子类的发行模板的对象,传递给父类的泛型模板使用。

例如:Integer集成Number,根据里氏替代原则:

Number number = new Integer(100);

对象创建的时候,可以直接将Integer对象赋值给number。

如果泛型中也希望达到这种效果,将子类的泛型赋值给父类泛型使用,怎么处理呢?可以通过通配符进行类型限定,从而实现协变

// 采用通配符实现协变
ArrayList<? extends Number> list1 = new ArrayList<Integer>();

协变:将父类保持了子类型的继承关系。通过协变实现子类型的泛型类型可以赋值给父类型泛型。

逆变:逆转了子类型的关系。将父类型泛型赋值给子类型泛型。

不变:两种关系都不满足

3.Java逆变

怎么将ArrayList<Number>赋值给ArrayList<Integer>呢?

通过? super实现逆变

ArrayList<? super Integer> list2 = new ArrayList<Number>();

参考文案:
Java泛型中的类型擦除详解 - 知乎


http://chatgpt.dhexx.cn/article/j7dNSqGE.shtml

相关文章

如何直接用Tomcat启动项目

我这里用的是自动安装版本的Tomcat 解压版的方法差不多&#xff0c;就是启动时到bin文件夹下双击startup文件 首先先得有一个war包&#xff08;war后缀文件&#xff09; 这里用eclipse工具做示范 1.确保你的web项目在eclipse里面能启动 2.导出war包 Finish之后就导出了war包。…

Mac启动tomcat的介绍

下载安装到官网上找一下资源就好&#xff0c;windows电脑可以直接双击startup来运行&#xff0c;而本篇博客介绍mac端如何启动tomcat 找到tomcat安装路径 打开访达&#xff0c;下载&#xff0c;找到名为apache-tomcat-版本号的文件 打开终端 进入tomcat文件夹下的bin路径 在…

Mac启动Tomcat

很多使用Mac的小伙伴下载好Tomcat&#xff0c;并不知道如何打开Tomcat&#xff0c;本篇文章将介绍如何开启Tomcat。 1、在访达中找到下载好的Tomcat文件夹 2、打开终端&#xff0c;使用命令进入该文件夹 cd apache-tomcat-10.0.203、进入该文件夹下的bin文件夹 cd bin此时可…

IDEA启动Tomcat失败

IDEA启动Tomcat失败的解决方法 1.运行Tomcat之后&#xff0c;找不到网页 2. Application Server was not connected before run configuration stop, reason: Unable to ping server at localhost:1099 3. 部署的tomcat项目呈断开状态 解决方法 在安装的tomcat路径中打开b…

windows系统启动tomcat服务的三种方式

1.双击执行tomcat/bin目录下的startup.bat文件,会自动显示一个命令行窗口(关闭窗口,服务会停止)&#xff0c;不推荐此方法&#xff0c;会严重影响系统访问速度。 2.将tomcat以服务的形式安装,然后在服务管理中,启动tomcat服务。 3.利用Windows的任务计划程序库,创建一个任务,让…

Tomcat启动项目的三种方式

Tomcat启动项目的三种方式 在这里介绍在Tomcat中部署web项目的三种方式&#xff1a; 1.部署解包的webapp目录 2.打包的war文件 3.Manager Web应用程序 一&#xff1a;部署解包的webapp目录 将Web项目部署到Tomcat中的方法之一&#xff0c;是部署没有封装到WAR文件中的Web…

Tomcat 启动流程

目录 一&#xff1a;流程 二&#xff1a;源码解析 1.Lifecycle 2 .各组件的默认实现 3 .源码入口 三&#xff1a;总结 一&#xff1a;流程 步骤 : 1 &#xff09;启动 tomcat &#xff0c; 需要调用 bin/startup.bat ( 在 linux 目录下 , 需要调用 bin/startup.sh…

tomcat两种启动方式

tomcat的两种启动方式&#xff0c;第一种&#xff0c;直接点击bin/startup.bat启动&#xff0c;第二种注册成服务启动 1、通过startup.bat启动 指定jdk&#xff1a;在tomcat/bin/setclasspath.bat 里面添加&#xff08;为什么要在setclasspath.bat里面添加&#xff0c;因为通…

深入springboot怎么启动tomcat

深入springboot怎么启动tomcat EnableAutoConfiguration做了哪些事小总结 Tomcat何时启动的呢&#xff1f;小总结 这是中高级工程师面试中常问的问题。 知道现在有多卷了吧&#xff01; 我记得我刚找工作那会儿&#xff0c;我只要8000的工资&#xff0c;面试官都要问这个问题。…

Windows如何设置Tomcat开机启动?

前置步骤&#xff1a; 在tomcat中的bin目录下&#xff0c;双击startup.bat运行tomcat&#xff0c; 在浏览器正常打开Tomcat情况下&#xff0c;说明tomcat安装正常&#xff0c;双击shutdown.bat停掉tomcat 第一步&#xff1a; 1、设置环境变量 2、在 用户变量 新建 CATALINA_H…

Linux服务器启动tomcat的三种方式

直接进入主题&#xff0c;首先cd进入tomcat的bin文件夹下&#xff0c;然后可以尝试以下三种启动方式&#xff1a; 第一种&#xff08;当前会话启动&#xff09;&#xff1a; ./startup.sh 效果: 然后tomcat就在后台启动了&#xff0c;我们还可以在当前会话中继续输入其它指令…

Tomcat-启动流程

文章目录 叨叨程序入口加载load流程简述Bootstrap.load()Catalina.load(params)init()模板方法init流程总结 start()模板方法流程简述start()模板方法Host.start()特别说明 叨叨 讲真&#xff0c;最开始源码调试几遍下来还是很懵了&#xff0c;尤其是组件初始化过程中不断去调用…

java教程(三)初识J2ee十三个规范

&#xfeff;&#xfeff; 我目前是个java未入门的新手&#xff0c;这边看到高手的一些文章&#xff0c;转载过来。---haogting J2EE是一套全然不同于传统应用开发的技术架构&#xff0c;主要可简化且规范应用系统的开发与部署&#xff0c;进而提高可移植性、安全与复用价值。 …

J2EE【开发环境搭建】

EasyUI【DataGrid数据查询】_云彩123的博客-CSDN博客_easyui 获取datagrid数据如需温习上一节内容&#xff0c;请点击下方链接进行跳转&#xff1a;EasyUI(Tree后端工作)_云彩123的博客-CSDN博客用户信息表&#xff08;T_User&#xff09;列名数据类型长度允许空默认值说明idva…

J2EE(环境搭建)

目录 一、jdk安装&环境配置 A、拿到exe文件 B、默认安装位置 C、配置环境变量 D、注意事项 二、Eclipse安装&设置默认编码集 A、解压 B、选择工作区间 C、设置默认编码集 Ca、设置jsp默认编码 Cb、设置workspace编码方式 三、配置Tomcat及JDK A、配置Tomcat …

java quartz 教程_Quartz 教程

一、关于 Quartz Quartz logo Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。 Quartz 可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。 Quartz 允许程序开发人员根据时间的间隔来调度作业。 Quartz 实现了作…

J2EE入门:环境搭建

前言&#xff1a; JDK的安装以及JDK的环境配置 tomcat的安装 Eclipce的环境配置 MySQL的安装 JDK安装以及环境配置 直接点击JDK安装包安装 JDK默认安装位置&#xff1a;C:\Program Files\Java 然后双击jdk144文件夹 进来之后选中地址栏复制地址 然后退出至桌面,右键桌面…

J2EE之旅(入门)

从这次开始我们就要开始学习j2ee&#xff0c;我们先来介绍一下我们将要使用到的 1.测试工具&#xff1a;ApiPost_Setup_5.4.2_x64.exe 2.开发工具:vs 3.数据库&#xff1a;考虑了多方面&#xff0c;数据库我们就选用mysql 4.数据库可视化工具&#xff1a; 由于这些软件安装大部…

J2EE入门教程

2005-12-11 20:20:21 J2EE入门教程本教程讲述Sun J2EE 1.3 SDK的安装、配置和创建并部署第一个简单的EJB。我们的目标平台是Windows XP SP2&#xff0c;JDK 1.4.2和J2EE SDK 1.3.1的Windows版本。我们在下面的实践中主要使用命令行模式&#xff0c;便于深入J2EE的内部机制。首先…

如何拥有个人的Github技术博客

题图&#xff1a;87testing.com 前不久用wordpress搭建了一个博客&#xff0c;用起来感觉不是太好用&#xff0c;并且数据库经常会发生异常挂掉&#xff0c;没找到解决方案。 看到有不少人使用的hexogithub方式搭建属于自己的博客&#xff0c; 于是&#xff0c;我也做了一些尝试…