Java泛型类型擦除以及类型擦除带来的问题--什么是泛型擦除

简介: Java泛型是伪泛型,编译后类型信息被擦除,仅保留原始类型。如`ArrayList<String>`与`ArrayList<Integer>`在运行时均为`ArrayList`,通过反射可绕过泛型限制添加非指定类型元素,证明泛型仅在编译期生效,JVM无法感知其存在。

我们都知道Java的泛型是伪泛型,即编译期间所有的泛型信息都会被擦除,如我们代码定义了:List和List,但是对于JVM而言,看到的只有List,由泛型附加的类型信息对于JVM而言是看不到的。代码说明如下:

1.1 原始类型擦除后相等
public class Test {
public static void main(String[] args) {
ArrayList list1 = new ArrayList();
list1.add("abc");

    ArrayList<Integer> list2 = new ArrayList<Integer>();
    list2.add(123);

    System.out.println(list1.getClass() == list2.getClass());
}

}
在这个例子中,我们定义了两个ArrayList数组,不过一个是ArrayList泛型类型的,只能存储字符串;一个是ArrayList泛型类型的,只能存储整数,最后,我们通过list1对象和list2对象的getClass()方法获取他们的类的信息,最后发现结果为true。说明泛型类型String和Integer都被擦除掉了,只剩下原始类型。

1.2 反射添加的元素被擦除
public static void main(String[] args)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
ArrayList list = new ArrayList();
list.add(1); //这样调用 add 方法只能存储整形,因为泛型类型的实例为 Integer
list.getClass().getMethod("add", Object.class).invoke(list, "asd");

    for (int i = 0; i < list.size(); i++) {
        // 输出1    asd
        System.out.println(list.get(i));
    }
}

如果直接调用add()方法,那么只能存储整数数据,不过当我们利用反射调用add()方法的时候,却可以存储字符串,这说明了Integer泛型实例在编译之后被擦除掉了,只保留了原始类型。

相关文章
|
8月前
|
Java
@Inherited 注解
@Inherited使@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan注解可被继承,SpringBoot主启动类因此具备自动配置、组件扫描等功能,简化配置。详情见:@Inherited作用说明。
|
3月前
|
数据采集 人工智能 监控
办公Agent + 企业知识库:自动生成季度报告与竞品分析文档
本文揭秘一款专为企业打造的办公Agent:它能自动连通CRM、飞书、竞品官网等知识源,按模板生成季度复盘与竞品分析初稿,引用皆可溯源。实测报告撰写从12小时缩至3分钟,人工仅需微调。不吹“全能”,只解决找资料慢、信息散、更新滞三大痛点。(239字)
351 4
|
弹性计算 关系型数据库 MySQL
阿里云服务器经济型e实例2核2G3M带宽99元搭建网站图文教程参考
经济型e实例2核2G,3M固定带宽,40G ESSD Entry云盘,价格只要99元,这是阿里云精心为开发者和普通企业用户推出的一款上云首选必备产品,可用于中小型的web应用以及企业应用。本文为大家展示使用这款云服务器搭建网站的相关教程,以供参考。
阿里云服务器经济型e实例2核2G3M带宽99元搭建网站图文教程参考
|
弹性计算 Ubuntu Unix
阿里云服务器操作系统有哪些?如何选择?
阿里云服务器操作系统镜像Alibaba Cloud Linux、Anolis OS、CentOS、Windows Server、Red Hat、SUSE Linux、Ubuntu、Debian、Fedora、Fedora CoreOS、OpenSUSE、FreeBSD、Rocky Linux、CentOS Stream和AlmaLinux,阿里云百科分享云服务器系统镜像选择方法
1728 0
阿里云服务器操作系统有哪些?如何选择?
|
机器学习/深度学习
【从零开始学习深度学习】23. CNN中的多通道输入及多通道输出计算方式及1X1卷积层介绍
【从零开始学习深度学习】23. CNN中的多通道输入及多通道输出计算方式及1X1卷积层介绍
【从零开始学习深度学习】23. CNN中的多通道输入及多通道输出计算方式及1X1卷积层介绍
|
机器学习/深度学习 人工智能 算法
一、单层感知器(MCP人工神经元模型)
一、单层感知器(MCP人工神经元模型)
|
人工智能 移动开发 JavaScript
AI + 低代码技术揭秘(二):核心架构
VTJ低代码平台架构包含引擎编排层、Provider服务系统、数据模型及代码生成管道,支持设计时与运行时功能。Engine管理设计流程,Provider处理服务加载,Simulator实现组件渲染,数据模型通过事件驱动同步状态。代码生成管道可双向转换Vue组件与DSL,支持多平台适配,如Web、H5和UniApp。系统提供可视化编辑、热重载与AI集成,满足高效开发需求。
386 0
|
存储 边缘计算 运维
开源物联网平台ThingsBoard数据库40张数据表设计一览
开源物联网平台ThingsBoard数据库40张数据表设计一览
3857 15
开源物联网平台ThingsBoard数据库40张数据表设计一览
|
前端开发 Java 应用服务中间件
Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)
Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)

热门文章

最新文章