当前位置: 首页 > 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…...

扩散模型之(十八)ControlNet 原理与指南

概述在当今瞬息万变的科技环境中&#xff0c;如何在人类创造力和机器精确性之间取得平衡变得日益重要。而这正是我们ControlNet发挥作用的地方——它如同“引导之手”&#xff0c;为基于扩散的文本到图像合成模型提供指导&#xff0c;从而解决传统图像生成模型中常见的局限性。…...

探索基于V2G技术的电动汽车车载充放电机Matlab仿真模型

基于V2G技术的电动汽车车载充放电机matlab仿真模型最近在研究电动汽车相关技术&#xff0c;V2G&#xff08;Vehicle-to-Grid&#xff09;技术特别吸引我。V2G技术允许电动汽车与电网进行双向能量交换&#xff0c;简单来说&#xff0c;电动汽车不仅能从电网充电&#xff0c;还能…...

TFT LCD屏幕硬件解析:从XPT2046触摸屏到背光控制的完整指南

TFT LCD屏幕硬件解析&#xff1a;从XPT2046触摸屏到背光控制的完整指南 在工业控制面板和医疗设备显示屏等专业领域&#xff0c;TFT LCD屏幕凭借其高精度显示和可靠触控性能成为首选方案。不同于消费级产品的通用设计&#xff0c;专业场景下的屏幕需要工程师深入理解从触摸采样…...

Tree of Thoughts终极指南:5分钟掌握思维树算法原理与实战应用

Tree of Thoughts终极指南&#xff1a;5分钟掌握思维树算法原理与实战应用 【免费下载链接】tree-of-thought-llm [NeurIPS 2023] Tree of Thoughts: Deliberate Problem Solving with Large Language Models 项目地址: https://gitcode.com/gh_mirrors/tr/tree-of-thought-l…...

Claude Code能控制电脑了!开发全程不离终端,全无人值守模式启动

在官方演示中&#xff0c;只甩一个指令过去&#xff0c;AI就自己启动正在开发的应用&#xff0c;自己复现bug&#xff0c;自己修复&#xff0c;自己测试修复效果。 Claude Code上线Computer Use&#xff0c;直接捅破开发效率天花板。 在官方演示中&#xff0c;只甩一个指令过…...

Lingyuxiu MXJ LoRA开源镜像指南:从下载到生成的完整开箱即用流程

Lingyuxiu MXJ LoRA开源镜像指南&#xff1a;从下载到生成的完整开箱即用流程 1. 项目简介 Lingyuxiu MXJ LoRA 是一款专门为生成唯美真人风格人像而设计的轻量级AI图像生成系统。这个项目最大的特点就是针对人像摄影进行了深度优化&#xff0c;能够生成五官精致、光影柔和、…...

QuickBMS深度解析:游戏资源逆向工程与批量处理技术实践

QuickBMS深度解析&#xff1a;游戏资源逆向工程与批量处理技术实践 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS 作为游戏逆向工程领域的瑞士军刀&#xff0c;QuickBMS以其卓越的文件格式解析…...

终极指南:如何为Muzei Live Wallpaper配置GitHub Actions自动化构建与测试

终极指南&#xff1a;如何为Muzei Live Wallpaper配置GitHub Actions自动化构建与测试 【免费下载链接】muzei Muzei Live Wallpaper for Android 项目地址: https://gitcode.com/gh_mirrors/mu/muzei Muzei Live Wallpaper是一款备受欢迎的Android动态壁纸应用&#xf…...

AI原生应用领域链式思考:构建高效应用架构

AI原生应用领域链式思考&#xff1a;构建高效应用架构 关键词&#xff1a;AI原生应用、链式思考、应用架构、大模型协同、上下文管理 摘要&#xff1a;本文从AI原生应用的核心特征出发&#xff0c;结合"链式思考"这一关键设计模式&#xff0c;系统讲解如何构建高效能…...

Z-Image-Turbo LoRA WebUI实战案例:为独立游戏开发者生成角色立绘素材

Z-Image-Turbo LoRA WebUI实战案例&#xff1a;为独立游戏开发者生成角色立绘素材 1. 项目概述与价值 作为一名独立游戏开发者&#xff0c;你是否曾经为角色立绘的设计而头疼&#xff1f;传统的美术外包成本高昂&#xff0c;自己绘制又需要专业技能。现在&#xff0c;通过Z-I…...