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

java基础学习: 什么是泛型的类型擦除

文章目录

  • 一、什么是泛型
    • 2、泛型编译前和编译后对比
    • 3、泛型的优点
      • (1)提高了代码的复用性和可读性
      • (2)提高了代码的安全性
  • 二、泛型的定义
    • 1、泛型类
    • 2、泛型接口
    • 3、泛型方法
  • 三、泛型通配符
    • 1、?和T有什么区别
    • 2、通配符的分类
      • 1、无界通配符
      • 2、泛型的上界通配符
      • 3、泛型的下界通配符
  • 四、PECS原则
  • 五、泛型的类型擦除

一、什么是泛型

泛型起到的作用就是将类型参数化,在不创建新类的情况下通过创建对象实例或应用时确定具体的数据类型,以提高代码的复用性以及用以解决类型爆炸问题。

例如集合类中使用了泛型,可以存储任意的对象,这些对象公用集合类中定义的方法和处理逻辑,不需要为每个对象重新定义集合类,实现了代码复用以及防止了类型爆炸问题。
在这里插入图片描述
例如ArrayLlist泛型类,虽然在实例化对象时可以指定具体的泛型变量类型,但是都对应同一个类对象:
在这里插入图片描述
上面的代码声明了两个ArrayList实例对象并指定的具体的泛型值,从上面的代码的运行结果来看它们具有相同的class对象。strList和intList在编译时是两个不同的类型,但是在编译完成后会进行类型擦除,我们可以使用java反编译工具进行类型擦除验证:
执行命令:jad -sJava Demo.class
结果:
在这里插入图片描述
通过上面的实验,可以得到的结论就是在进行代码编译后进行了泛型的类型擦除操作。

2、泛型编译前和编译后对比

编译前:
在这里插入图片描述
编译后:
对class使用jad进行反编译:jad -sJava Demo.class
在这里插入图片描述
从上面的验证可以看出,编译后对泛型的类型进行了类型擦除操作(使用Object替换泛型),在使用时进行了类型转换(调用function方法是返回值进行了强制类型转换)。

3、泛型的优点

(1)提高了代码的复用性和可读性

  • 如果不使用泛型,会为多个不同类型的对象创建多分处理逻辑相同的代码,然而泛型可以让我们编写通用的代码处理逻辑,只需要我们在使用时将泛型具体化到具体的类型即可。
  • 泛型在使用时只需要根据我们的需求指定具体的类型,不需要额外的操作,根据具体的类型我们就可以判断出程序的意图,有较强的可读性。

(2)提高了代码的安全性

以集合容器为例,如果使用Object在运行的时候需要进行手动的强制类型转换,可能出现类型转换异常;但是在编译期没有任何的错误提示。
在这里插入图片描述

如果使用泛型在编译期进行类型安全性检查,避免运行时出现类型转换异常。
在这里插入图片描述

二、泛型的定义

泛型可以定义在类、接口和方法中,分别称为泛型类、泛型接口和泛型方法

1、泛型类

把泛型定义在类上。格式为:修饰符class 类名<泛型类型1,…>
示例演示:

ublic class Tool<Q> {private Q q;public Q getObj(){return q;}public void setObj(Q q) {this.q = q;}

2、泛型接口

把泛型定义在接口上,格式:修饰符 interface接口名<泛型类型>
示例演示:

interface Inter<T> {public void show(T t);
}

3、泛型方法

把泛型定义在方法上,格式:修饰符 <泛型类型> 返回值类型 方法名(类型 变量名) { }。
示例演示:

public <T> void demo(T t) { //具体方法逻辑
} 

三、泛型通配符

通配符在编码使用上存在着一些约定成俗的规范,这些规范让代码的可读性更高,此外并无其他的作用:

  • T: 表示任意类型
  • E: 表示集合类型
  • K、V:表示键值对类型
  • ?:泛型通配符<?>, 表示未知类型;如果没有明确指定那么就表示Object以及任意的Java类型。

1、?和T有什么区别

  • ?:通配符只能用作引用参数。可当做变量来使用(不可以单独使用)且不可以对元素做修改、新增等操作。
    • 通配符不可以直接用在类上
      在这里插入图片描述
    • 通配符不可以直接用在方法上
      在这里插入图片描述
  • T:可以单独使用,可以声明类、接口和方法

2、通配符的分类

1、无界通配符

无界通配符使用?表示可以匹配任意类型。例如List<?>表示一个位置的列表,在操作时只能进行查看操作,不能进行修改、新增操作,因为无法确定添加的元素是否与列表的元素一致。
在这里插入图片描述

2、泛型的上界通配符

泛型的上界通配符的格式为:<? extends E>,其中E表示类型参数。上界通配符表示可以匹配E或者E的子类,指定了泛型的类型范围。仅仅可以进行获取操作。
在这里插入图片描述
案例分析:
在这里插入图片描述
反编译字节码:
在这里插入图片描述

3、泛型的下界通配符

反省的下界通配符的格式为:<? super E> 其中E表示类型参数,下界通配符表示可以匹配E或者E的父类,指定了泛型的类型范围。可以进行新增和获取操作
在这里插入图片描述
案例分析:
在这里插入图片描述
反编译字节码:
在这里插入图片描述

四、PECS原则

PECS原则的全称是Producer Extends Consumer Super(上界生成,下界消费)

五、泛型的类型擦除

泛型的类型擦除有一下特点:

  • java泛型,只在编译期有效
  • 在编译成字节码文件后,泛型类型被擦除,被替换成Object。

相关文章:

java基础学习: 什么是泛型的类型擦除

文章目录 一、什么是泛型2、泛型编译前和编译后对比3、泛型的优点&#xff08;1&#xff09;提高了代码的复用性和可读性&#xff08;2&#xff09;提高了代码的安全性 二、泛型的定义1、泛型类2、泛型接口3、泛型方法 三、泛型通配符1、&#xff1f;和T有什么区别2、通配符的分…...

Vue+OpenLayers7入门到实战:在地图上添加缩放控件、比例尺控件和鼠标经纬度位置显示控件

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章主要介绍如何使用OpenLayers7在地图上添加地图缩放控件,比例尺显示控件和鼠标经纬度位置展示控件这三个Control控件。 二、依赖和使用 "ol": "7.5.2"使用npm安装依赖npm install ol@7.5.…...

极简生活|可以慢慢变富的8个习惯

哈喽&#xff0c;大家好啊&#xff0c;我是雷工&#xff01; 巴菲特巴老爷子曾经多次指出&#xff1a; 大多数投资者的问题就在于不愿意慢慢变富。 可是大多数人都急于一夜暴富&#xff0c;于是乎那么多的追涨杀跌&#xff0c;不断上演&#xff0c;越急功近利反而越损失惨重。 …...

MySQL基础(一)

学习数据库的目的&#xff1a; 实现数据持久化到本地。使用完整的管理系统统一管理&#xff0c;可以实现结构化查询&#xff0c;方便管理。 一、数据库概述 数据库&#xff08;DataBase&#xff09; 为了方便数据的存储和管理&#xff0c;它将数据按照特定的 规则存储在磁盘…...

【Linux编译器-gcc/g++使用】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 设计样例&#xff0c;先见一下 方案一&#xff1a; 方案二&#xff1a; 在企业里面一般维护软件的源代码的话&#xff0c;要维护几份&#xff1f; 方案一&…...

SQL提示与索引终章

✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL-进阶篇 &#x1f4dc; 感谢大家的关注&#xff01; ❤️ 可以关注黑马IT&#xff0c;进行学习 目录 &#x1f680;SQL提示 &#x1f680;覆盖索引 &#x1f680;前缀索引 &…...

基于OpenSSL的SSL/TLS加密套件全解析

概述 SSL/TLS握手时&#xff0c;客户端与服务端协商加密套件是很重要的一个步骤&#xff0c;协商出加密套件后才能继续完成后续的握手和加密通信。而现在SSL/TLS协议通信的实现&#xff0c;基本都是通过OpenSSL开源库&#xff0c;本文章就主要介绍下加密套件的含义以及如何在O…...

01-echarts如何绘制三维折线图

echarts如何绘制三维折线图 一、相关依赖包1、下载依赖2、引入依赖 二、创建图表盒子1、创建盒子2、定义数据3、编写方法1、初始化盒子2、设置配置项3、修改数据格式4、设置颜色数组4、设置name数组5、设置线三维和点三维6、添加配置项7、设置图表自适应 4、调用方法 三、整体代…...

Linux-共享内存

文章目录 前言一、system V共享内存申请共享内存挂载共享内存删除共享内存挂载删除共享内存 二、示例代码三.运行效果 前言 在这之前我们已经学习了两种进程间通信方式&#xff1a;匿名管道和命名管道。 从我们之前的学习已经知道&#xff0c;想让多个进程间进行通信就需要让他…...

深入分析 Linux 网络丢包问题

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/134398330 所谓丢包&#xff0c;是指在网络数据的收发过程中&#xff0c;由于种种原因&#xff0c;数据包还没传输到应用程序中&#xff0c;就被丢弃了。这些被丢弃包的数量&#…...

web安全学习笔记【08】——算法1

思维导图在最后 #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载均衡等 ----------------------------------- 1、APP架构-封装&原生态&…...

2024最新版Python 3.12.1安装使用指南

2024最新版Python 3.12.1安装使用指南 Installation and Configuration Guide to the latest version Python 3.12.1 in 2024 By Jackson Python编程语言&#xff0c;已经成为全球最受欢迎的编程语言之一&#xff1b;它简单易学易用&#xff0c;以标准库和功能强大且广泛外挂…...

Oracle 经典练习题 50 题

文章目录 一 CreateTable二 练习题1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数2 查询"01"课程比"02"课程成绩低的学生的信息及课程分数3 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩4 查询平均成绩小于…...

PyTorch的衍生资源

PyTorch作为深度学习领域的一个重要框架&#xff0c;自2016年首次发布以来经历了显著的发展。以下是PyTorch发展过程中的几个关键里程碑事件&#xff1a; 2016年&#xff1a; PyTorch于2016年首次发布&#xff0c;作为一个基于动态计算图的开源机器学习库&#xff0c;它提供了自…...

开源项目Git Commit规范与ChangeLog

一&#xff0c;conventional commit(约定式提交) Conventional Commits 是一种用于给提交信息增加人机可读含义的规范。它提供了一组用于创建清晰的提交历史的简单规则。 1.1 作用 自动化生成 CHANGELOG基于提交类型&#xff0c;自动决定语义化的版本变更向项目相关合作开发…...

【原理图PCB专题】OrCAD Capture CIS关闭开始界面

17.4版本 在打开OrCAD Capture CIS时会发现打开Start Page页面&#xff0c;那么如何将他关闭再也不看这个界面呢&#xff1f; 在窗口中输入SetOptionBool EnableStartPage 0 回车 重启软件后就再也不会弹出Start Page页面 如果没有发现Command Window那么将菜单栏view->C…...

【Linux】Ubuntu的gnome切换KDE Plasma

文章目录 安装KDE Plasma桌面环境添加软件源并更新apt安装kubuntu-desktop&#xff08;作者没有成功&#xff09;aptitude安装kubuntu-desktop多次aptitude install&#xff08;特别重要特别重要&#xff09;其他kde软件包 卸载gnome桌面 Ubuntu自带的桌面环境是gnome&#xff…...

Docker(九)Docker Buildx

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Docker Buildx Docker Buildx 是一个 docker CLI 插件&#xff0c;其扩展了 docker 命令&#xff0c;支持 [Moby BuildKit] 提供的功能。提…...

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求&#xff0c;仅想提高sink2es的qps&#xff0c;所以仅调节了sink2es的并行度&#xff0c;但在调节不同算子并行度时遇到一些问题&#xff0c;找出问题的根本原因解决问题&#xff0c;并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …...

瑞_数据结构与算法_二叉搜索树

文章目录 1 什么是二叉搜索树1.1 二叉搜索树的特征1.2 前驱后继 2 二叉搜索树的Java实现2.1 定义二叉搜索树节点类BSTNode泛型key改进 2.2 实现查找方法get(int key)递归实现非递归实现 ★非递归实现 泛型key版本 2.3 实现查找最小方法min()递归实现非递归实现 ★ 2.4 实现查找…...

计算机毕业设计springboot基于的游戏后台管理系统 基于SpringBoot的网游运营管理平台的设计与实现 基于SpringBoot架构的电子竞技服务支撑系统的设计与实现

计算机毕业设计springboot基于的游戏后台管理系统&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网技术的飞速发展和智能终端设备的全面普及&#xff0c;游戏产业已迅速…...

C语言回调函数在TCP客户端中的实现与应用

C语言回调函数在TCP客户端中的实现与应用1. 回调函数基础概念回调函数是一种通过函数指针实现的编程机制&#xff0c;允许将一个函数作为参数传递给另一个函数。在C语言中&#xff0c;回调函数的实现完全依赖于函数指针&#xff0c;这与C、Python等现代语言中可能使用仿函数或匿…...

如何用ChatALL实现AI智能协同:一次提问,多模型对比的解决方案

如何用ChatALL实现AI智能协同&#xff1a;一次提问&#xff0c;多模型对比的解决方案 【免费下载链接】ChatALL Concurrently chat with ChatGPT, Bing Chat, Bard, Alpaca, Vicuna, Claude, ChatGLM, MOSS, 讯飞星火, 文心一言 and more, discover the best answers 项目地…...

3.23-3.25笔记

这期实现温湿度采集、光照强度监测、智能设备控制&#xff08;加湿器、PWM 调光 LED、PWM 调速风扇&#xff09;确定引脚&#xff0c;根据原理图找出可以使用的引脚开关。根据手册信息PWM口GPIO0_D0和GPIO0_C6&#xff0c;把设备树GPIO0_D0做5G的复位disable&#xff0c;再加入…...

GPIO的输出输入方式总结

GPIO的四种输入方式GPIO的四种输出方式...

staticFunctional:嵌入式零堆内存的std::function替代方案

1. staticFunctional&#xff1a;嵌入式系统中零动态内存开销的 std::function 替代方案1.1 设计动因与工程痛点在资源受限的嵌入式系统&#xff08;如 ARM Cortex-M0/M4、AVR、ESP32、Teensy 系列&#xff09;中&#xff0c;std::function的标准实现存在根本性兼容障碍。其典型…...

IOMMU性能调优全攻略:从基础原理到实战技巧

IOMMU性能调优全攻略&#xff1a;从基础原理到实战技巧 在数据中心和云计算环境中&#xff0c;IOMMU&#xff08;输入输出内存管理单元&#xff09;作为硬件辅助虚拟化的关键技术组件&#xff0c;其性能表现直接影响着整个系统的吞吐量和延迟。对于需要处理高并发I/O负载的场景…...

【数据结构与算法】最小生成树Kruskal

1.#include <iostream> #include <algorithm> #include <vector> using namespace std;struct Edge {int u, v, w; // 起点&#xff0c;终点&#xff0c;边权 };vector<Edge> edges; vector<int> parent;// 比较函数&#xff1a;按边权升序排列…...

OctoLinker:突破跨平台代码导航壁垒,实现无缝开发体验

OctoLinker&#xff1a;突破跨平台代码导航壁垒&#xff0c;实现无缝开发体验 【免费下载链接】OctoLinker OctoLinker — Links together, what belongs together 项目地址: https://gitcode.com/gh_mirrors/oc/OctoLinker 跨平台开发中&#xff0c;开发者常常面临不同…...

终极实战指南:在Docker容器中运行Windows系统的完整解决方案

终极实战指南&#xff1a;在Docker容器中运行Windows系统的完整解决方案 【免费下载链接】windows Windows inside a Docker container. 项目地址: https://gitcode.com/GitHub_Trending/wi/windows 还在为Windows虚拟机占用大量系统资源而烦恼吗&#xff1f;想体验在容…...