当前位置: 首页 > news >正文

介绍⼀下泛型擦除

1.是什么

        泛型擦除(Type Erasure)是Java泛型实现中的一个重要概念。Java的泛型是通过类型擦除来实现的,这意味着在运行时,泛型信息(即类型参数的具体类型)是不可用的。编译器在编译时会对泛型代码进行擦除处理,将所有的泛型类型替换为它们的原始类型(raw type),通常是Object,同时插入必要的类型转换以保持类型安全。


泛型擦除的详细解释

  1. 编译时与运行时

    • 编译时:Java编译器会检查泛型代码,确保类型安全。例如,它会确保你不会将String对象放入List<Integer>中。
    • 运行时:由于Java的泛型是通过擦除来实现的,所以在运行时,所有的泛型信息都会被擦除。JVM看到的只是原始类型,而不是泛型类型。
  2. 类型擦除的示例

假设我们有以下泛型类和方法:

public class Box<T> {  private T t;  public void set(T t) {  this.t = t;  }  public T get() {  return t;  }  
}  public void printBoxContent(Box<?> box) {  System.out.println(box.get());  
}

        在编译时,编译器会检查Box类中T类型的用法,确保它们都是安全的。但是,在编译成字节码后,所有的T都会被替换为Object(如果T没有上界限制的话)。因此,上面的Box类在运行时实际上等价于:

public class Box {  private Object t;  public void set(Object t) {  this.t = t;  }  public Object get() {  return t;  }  
}

注意:虽然类型被擦除了,但Java编译器会通过生成桥接方法(bridge methods)和类型转换来保持类型安全。

3.桥接方法

当子类覆盖了泛型父类中的方法,并且子类的方法使用了不同的类型参数时,编译器会生成桥接方法。桥接方法是一种合成方法,它允许子类的方法能够覆盖父类中具有相同擦除签名的方法。

4.类型转换

在泛型代码中,尽管运行时没有泛型类型信息,但编译器会插入必要的类型转换。这些类型转换在运行时执行,但由于它们是在编译时根据类型安全的规则插入的,因此不会引发ClassCastException(除非你的代码本身就有错误)。

5.类型参数的上界

如果泛型类型参数有上界(如T extends Number),则擦除后的类型将是该上界的具体类型(在这个例子中是Number),而不是Object

泛型擦除的影响

  • 性能:由于泛型信息在运行时不可用,因此使用泛型通常不会对性能产生负面影响(相对于使用原始类型)。然而,某些情况下,由于需要额外的类型转换,可能会引入一些微小的性能开销。
  • 限制:由于泛型擦除,你不能在运行时检查泛型类型参数的具体类型(即你不能使用instanceof来检查某个泛型对象是否是某个特定类型的实例)。此外,你也不能创建泛型类型的Class对象(如Class<List<String>>是不可能的,但你可以使用Class<List>)。
  • 设计考虑:了解泛型擦除对于设计泛型API和库至关重要。它可以帮助你避免常见的陷阱,如错误地假设运行时存在泛型类型信息。

相关文章:

介绍⼀下泛型擦除

1.是什么 泛型擦除&#xff08;Type Erasure&#xff09;是Java泛型实现中的一个重要概念。Java的泛型是通过类型擦除来实现的&#xff0c;这意味着在运行时&#xff0c;泛型信息&#xff08;即类型参数的具体类型&#xff09;是不可用的。编译器在编译时会对泛型代码进行擦除处…...

从底层原理上理解ClickHouse 中的 Distributed 引擎

ClickHouse 的 Distributed 引擎 是实现大规模分布式查询和高可用性的关键技术之一&#xff0c;它允许集群中的多个节点协同工作&#xff0c;提供横向扩展能力和负载均衡机制。在底层&#xff0c;Distributed 引擎通过一系列的机制和策略&#xff0c;确保数据的分布、查询的并行…...

社区志愿者服务系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;志愿者管理&#xff0c;社区管理&#xff0c;活动类型管理&#xff0c;志愿者活动管理&#xff0c;活动报名管理&#xff0c;活动签到管理&#xff0c;证书信息管理&#xff0c;系统管理 微信端账号功…...

echarts map地图动态下钻,自定义标注,自定义tooltip弹窗【完整demo版本】

在数据可视化中&#xff0c;地图是很重要的一个环节&#xff0c;很多时候需要展现的不仅是国家地图&#xff0c;还需要能从国家进入到省市。这个逐级进入的过程就是我们今天说的地图下钻。 地图下钻看起来很屌、很高大上&#xff0c;但是仔细琢磨一下&#xff0c;技术实现上真的…...

Python热频随机森林分类器算法模型模拟

&#x1f3af;要点 研究发射测量斜率和时滞热频率表征&#xff0c;使用外推法计算三维磁场并定性比较使用基于焓的热演化环模型模拟每条线的热力学响应&#xff0c;测试低频、中频和高频热场景使用光学薄、高温、低密度等离子体的单位体积辐射功率或发射率公式等建模计算使用直…...

C++11新增特性:lambda表达式、function包装器、bind绑定

一、lambda表达式 1&#xff09;、为啥需要引入lambda&#xff1f; 在c98中&#xff0c;我们使用sort对一段自定义类型进行排序的时候&#xff0c;每次都需要传一个仿函数&#xff0c;即手写一个完整的类。甚至有时需要同时实现排升序和降序&#xff0c;就需要各自手写一个类&…...

动态主题模型DTM(Dynamic topic model)简介及python代码

文章目录 DTM模型简介DTM实现1:gensim.models.ldaseqmodel包DTM实现2:gensim.models.wrappers.dtmmodel.DtmModel包DTM模型简介 DTM模型(Dynamic Topic Model)是一种用于文本数据分析的概率模型,主要用于发现文本数据背后的主题结构和主题的演化过程。DTM模型是LDA模型的…...

GDPU MySQL数据库 天码行空1 数据库的创建和基本操作

&#x1f496; 必看 MySQL 5.7默认的 innodb 存储引擎Windows10 和 Centos7 一、实验目的 1&#xff0e;熟知机房用机安全规则。 2&#xff0e;通过上机操作&#xff0c;加深对数据库系统理论知识的理解&#xff1b;通过使用具体的DBMS&#xff0c;了解一种实际的数据库管理系…...

《告别卡顿,一键卸载!IObit Uninstaller 13 免费版让电脑重获新生》

随着电脑使用时间的增长&#xff0c;各种软件的安装和卸载&#xff0c;难免会让电脑变得臃肿不堪&#xff0c;运行速度大不如前。你是否也有过这样的烦恼&#xff1f;别担心&#xff0c;IObit Uninstaller 13 免费版来帮你解决这个问题&#xff01; IObit Uninstaller 13 是一…...

Python|基于Kimi大模型,实现上传文档并进行对话(5)

前言 本文是该专栏的第5篇,后面会持续分享AI大模型干货知识,记得关注。 我们在利用大模型进行文本处理的时候,可能会遇到这样的情况。 笔者在这里举个例子,比如说我们的目标文本是一堆docx文档,或者pdf文档,doc文档等等。这时需要大模型对这样的文档文本内容进行语义处…...

C++设计模式——Prototype Pattern原型模式

一&#xff0c;原型模式的定义 原型模式是一种创建型设计模式&#xff0c;它允许通过克隆已有对象来创建新对象&#xff0c;从而无需调用显式的实例化过程。 原型模式的设计&#xff0c;使得它可以创建一个与原型对象相同或类似的新对象&#xff0c;同时又可以减少对象实例化…...

Vue3 : ref 与 reactive

目录 一.ref 二.reactive 三.ref与reactive的区别 四.总结 一.ref 在 Vue 3 中&#xff0c;ref 是一个用于创建可读写且支持数据跟踪的响应式引用对象。它主要用于在组件内部创建响应式数据&#xff0c;这些数据可以是基本类型&#xff08;如 number、string、boolean&…...

html实现好看的多种风格手风琴折叠菜单效果合集(附源码)

文章目录 1.设计来源1.1 风格1 -图文结合手风琴1.2 风格2 - 纯图片手风琴1.3 风格3 - 导航手风琴1.4 风格4 - 双图手风琴1.5 风格5 - 综合手风琴1.6 风格6 - 简描手风琴1.7 风格7 - 功能手风琴1.8 风格8 - 全屏手风琴1.9 风格9 - 全屏灵活手风琴 2.效果和源码2.1 动态效果2.2 源…...

Nacos分布式配置中心

分布式配置的优势&#xff1a; 不需要重新发布我们的应用 新建父工程&#xff1a;【将它作为跟 所以要把父工程里面的src删掉】 新建子模块&#xff1a; 新建bootstrap.properties&#xff1a; 在使用Nacos作为配置中心时&#xff0c;推荐在bootstrap.properties中配置Nacos相…...

C# WinForm 中 DataGridView 实现单元格cell 能进编辑状态但是不能修改单元格的效果

在Windows Forms&#xff08;WinForms&#xff09;开发中&#xff0c;DataGridView 控件是一个功能强大的组件&#xff0c; 用于显示和管理表格数据。无论是展示大量数据&#xff0c;还是实现交互式的数据操作&#xff0c; DataGridView 都能提供多样的功能支持&#xff0c;比如…...

GANs-生成对抗网络

参考&#xff1a; https://mp.weixin.qq.com/s?__bizMjM5ODIwNjEzNQ&mid2649887403&idx3&snf61fc0e238ffbc56a7f1249b93c20690&chksmbfa0f632460e035f00be6cc6eb09637d91614e4c31da9ff47077ca468caad1ee27d08c04ca32&scene27 https://cloud.tencent.com…...

e冒泡排序---复杂度O(X^2)

排序原理: 1.比较相邻的元素。如果前一个元素比后一个元素大&#xff0c;就交换这两个元素的位置。 2.对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值, public class 冒泡排序 {public static void main(String[] args) {I…...

C语言--结构体(学习笔记)

内容借鉴于b站杜远超官方频道&#xff08;C语言结构体详解【干货】&#xff09; 首先C语言中定义变量格式为“数据类型 变量名”&#xff0c;如int a; float b;等等。 那么结构体则是将多个变量&#xff08;数据类型 变量名&#xff09;结合在一起的一种新的数据类型&…...

Vue项目中实现用户登录后跳回原地址

本地存储 在 Vue 3 中&#xff0c;你可以使用 Vue Router 和 sessionStorage 或 localStorage 来实现用户登录后跳回原来的页面。以下是一种常见的实现方式&#xff1a; 在用户登录之前&#xff0c;记录当前页面的路由路径&#xff1a; 在需要登录的页面组件中&#xff0c;在…...

【Google Chrome Windows 64 version及 WebDriver 版本】

最近升级到最新版本Chrome后发现页面居然显示错乱实在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 64 位 VersionSize下载地址Date104.0.5112.10282.76 MBhtt…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...