首页 > 其他分享 >泛型擦除的原理

泛型擦除的原理

时间:2024-06-08 16:44:09浏览次数:14  
标签:List list 类型 add 擦除 泛型 原理

以下程序的输出是什么:

List<String> stringList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
//输出true System.out.println(stringList.class == intList.class);

输出为true,这意味两个list的class地址都一样,为同一个字节码文件。

这个试验也侧面反映出一个现象:泛型在运行时就不存在了。事实上也确实如此,那么是怎么做到在编译时能“限制”类型,而在运行时又没有了“限制”呢?

所谓的类型擦除(type erasure),指的是泛型只在编译时起作用,在进入JVM之前,泛型会被擦除掉,根据泛型定义的形式而被替换为相应的类型。这也说明了Java的泛型其实是伪泛型。

无界擦除

  当泛型类型被声明为一个具体的泛型标识,或一个无界通配符时,泛型类型将会被替代为Object

上界擦除

  当泛型类型被声明为一个上界通配符时,泛型类型将会被替代为相应上界的类型。如List<? extends Number>,程序并不能够确定具体的类型,只知道是Number或其子类,所以会擦除为Number类型。

下界擦除

  下界通配符的擦除,同无界通配符,只能确定下界类型,但是上界类型无法确定,所以只能替换为Object。如List<? extends Integer>,程序并不能够确定具体的类型,只知道是Number或其子类,

所以会擦除为Object类型。

绕过编译时泛型类型检查

 
List<Integer> list = new ArrayList<>();
list.add(123);        // 正常编译
list.add("string"); // 编译报错【不兼容的类型: java.lang.String无法转换为java.lang.Integer】

基于类型擦除,我们可以利用反射绕过这个限制。

List<Integer> list = new ArrayList<>();
list.add(123);
try {
    // 由于List中的泛型参数没有设置上界,所以add方法可以add任何Object的子类型参数
    Method method = list.getClass().getDeclaredMethod("add", Object.class);
    method.invoke(list, "string");
    method.invoke(list, true);
    method.invoke(list, 45.6);
} catch (Exception e) {
    e.printStackTrace();
}

 

 

 

标签:List,list,类型,add,擦除,泛型,原理
From: https://www.cnblogs.com/zhengbiyu/p/18238739

相关文章

  • 一文看懂llama2(原理&模型&训练)
    自从Transformer架构问世以来,大型语言模型(LargeLanguageModels,LLMs)以及AIGC技术的发展速度惊人,它们不仅在技术层面取得了重大突破,还在商业应用、社会影响等多个层面展现出巨大潜力。随着ChatGPT的推出,这一技术日益走进大众视野,这也预示着一个由生成式AI塑造的未来正在加速......
  • SELinux 基本原理
    首发公号:Rand_csSELinux基本原理本文讲述SELinux保护安全的基本原理安全检查顺序不废话,直接先来看张图当我们执行系统调用的时候,会首先对某些错误情况进行检查,如果失败通常会得到一些error信息,通过查看全局变量errno可以知道到底是哪一类错误随后进行DAC检查,简......
  • 大语言模型的底层原理,ChatGPT,文心一言等人工智能体是如何产生的?本文将详细讲解
    文章目录基础介绍一、预训练1.数据准备质量过滤敏感内容过滤数据去重数据预处理实践质量过滤去重隐私过滤2.词元化BPE分词WordPiece分词Unigram分词3.数据调度总结参考文献基础介绍大语言模型是指在海量无标注文本数据上进行预训练得到的大型预训练语言模型,例......
  • Pyramid Vision Transformer, PVT(ICCV 2021)原理与代码解读
    paper:PyramidVisionTransformer:AVersatileBackboneforDensePredictionwithoutConvolutionsofficialimplementation:GitHub-whai362/PVT:OfficialimplementationofPVTseries存在的问题现有的VisionTransformer(ViT)主要设计用于图像分类任务,难以直接用......
  • Spring AOP 原理(摘要: 原创出处 jianshu.com/p/e18fd44964eb 「莫那一鲁道」)
    AOP的设计:每个Bean都会被JDK或者Cglib代理。取决于是否有接口。每个Bean会有多个“方法拦截器”。注意:拦截器分为两层,外层由Spring内核控制流程,内层拦截器是用户设置,也就是AOP。当代理方法被调用时,先经过外层拦截器,外层拦截器根据方法的各种信息判断该方法应该执行......
  • 网络原理-计算机网络详解-网线传递数字信号的原理
    网络原理-计算机网络详解-网线传递数字信号的原理家用的网线:传递的数字信号,原理是:(1)和电线传输电的原理一样,只不过网线上传输的就是脉冲电信号,而且遵守一定的电器规则。(2)计算机上的数据都是用0和1来保存的,所以在网线上传输时就要用一个电压表示数据0,用另一个电压表示数据1。(3)网......
  • 深度解读ChatGPT基本原理
    目录一、引言二、ChatGPT概述三、ChatGPT的基本原理Transformer架构预训练与微调语言建模生成式建模四、ChatGPT的应用与优势五、结论一、引言在人工智能领域,自然语言处理(NLP)一直是研究的热点之一。随着技术的不断进步,我们见证了从简单的聊天机器人到复杂的语言模......
  • 【算法】深入浅出爬山算法:原理、实现与应用
     人不走空                                           ......
  • Java 的动态代理是基于什么原理?
    Java的动态代理是基于以下原理实现的:代理模式:代理模式是一种设计模式,通过创建一个代理对象来控制对真实对象的访问。代理对象可以在调用真实对象之前或之后增加额外的逻辑,比如权限验证、记录日志等。代理模式的主要目的是在不修改原有代码的基础上,扩展对象的行为。动......
  • 【源码】Spring Data JPA原理解析之事务注册原理
     SpringDataJPA系列1、SpringBoot集成JPA及基本使用2、SpringDataJPACriteria查询、部分字段查询3、SpringDataJPA数据批量插入、批量更新真的用对了吗4、SpringDataJPA的一对一、LazyInitializationException异常、一对多、多对多操作5、SpringDataJPA自定义......