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

Java简单认识泛型——图文详解

写在开头:想必大家和博主一样,在以往学习JavaSE的语法中,遇到了一个陌生的词——泛型,博主当时很好奇,什么是泛型呢?即使是学完了JavaSE,这个问题都没有解决,只能在百度查阅了解关于泛型的一些皮毛。却不成想,在数据结构的第一课就接触到了这个问题,为了能帮助大家简单的认识泛型,博主通过学习以及查阅诸多资料,决定写下本篇博客并分享给大家,希望能够帮助到和博主当时有一样困境的小伙伴,同时博主也在持续更新各方面的知识内容,欢迎大家动动手指点个关注,第一时间阅读博主的分享内容!
同时博主也毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课。接下来和博主一起学习吧!

本文内容概要:

  • 一、泛型的本质
  • 二、包装类
    • 2.1 基本数据类型
    • 2.2 装箱与拆箱
  • 三、泛型与泛型类的使用
    • 3.1泛型语法
    • 3.2使用举例
    • 3.3泛型类
  • 四、泛型编译机制
    • 4.1擦除机制
    • 4.2提出问题
  • 五、泛型上界
    • 5.1语法
    • 5.2实例
  • 泛型进阶

一、泛型的本质

我们有没有想过:实现一个类,可以放入任意类型的数据,同时也可以根据成员方法来返回对应下标的值?以往的学习过程中,我们对数组的使用是刻板的,只能单一的放入指定类型元素,我们会发现这种数组是对代码充满了束缚。所以在JDK1.5以后,我们的前辈提出了泛型这一概念来实现对类型的参数化
泛型的实质在于:指定当前的容器,他存储的对象应该是什么类型,然后通过编译器去检查,所以我们需要将类型作为参数进行传递
在介绍泛型的使用之前,我们先介绍包装类以及装箱、拆箱的有关知识,以便于我们可以深入学习泛型知识

二、包装类

2.1 基本数据类型

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应一个包装类型。对于基本数据类型来说,除int、char以外其他基本类型都是将基本数据类型首字母大写,而int、char对应的包装类型为Integer、Character,而每个包装类底下也对应着诸多方法,我们不在此过多叙述,可以参考博主其他博客进行参考学习

2.2 装箱与拆箱

public class Fx {int i = 10;// 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中Integer A = Integer.valueOf(i);Integer B = new Integer(i);// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中int j = A.intValue();
}

当然,我们在日常的使用中是不这样写的,因为上述的装箱与拆箱会为开发者增加不少代码量,显的比较繁琐,于是Java又引申出了自动装箱与自动拆箱的语法,如下所述:

    int i = 10;Integer A = i; // 自动装箱Integer B = (Integer)i; // 自动装箱int j = A; // 自动拆箱int k = (int)B; // 自动拆箱

相信各位老铁看到这里也不需要过多说明已经明白了装箱以及拆箱,接下来让我们去了解了解泛型究竟是个什么样的神奇语法!

三、泛型与泛型类的使用

3.1泛型语法

class 泛型类名称<泛型类型1,泛型类型2...> {// 这里可以使用类型参数
}

注意我们有个注意点【规范】:类型形参一般使用一个大写字母表示,常用的名称有:

E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type S, U, V 等等 第二、第三、第四个类型

3.2使用举例

class MyArray<T> {//T[] ts = new T[5]; 是不对的,我们在4.2讨论public T[] array = (T[])new Object[10];//这里是最优的写法吗?public T getPos(int pos) {return this.array[pos];}public void setVal(int pos,T val) {this.array[pos] = val;}
}public class Fx {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<>();//传入Integer类型形参myArray.setVal(0,10);myArray.setVal(1,12);int ret = myArray.getPos(1);System.out.println(ret);//myArray.setVal(2,"bit");//报错,编译器检查发现与传入类型不符}
}

结果如下图:
在这里插入图片描述

3.3泛型类

语法:

泛型类<类型实参> 变量名; // 定义一个泛型类引用new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象//示例如下:
MyArray<Integer> list = new MyArray<Integer>();//我们可以省去第二个Integer,编译器可以推导得出类型实参

泛型注意事项:泛型类型必须是包装类(非基本数据类型)

四、泛型编译机制

4.1擦除机制

想必有很多小伙伴想问泛型到底是怎么编译的?泛型在博主看来是比较难的一种语法类型,我们接着往下看吧,相信博主可以替你解除疑惑!
感兴趣的小伙伴可以自己操作一下:
通过命令:javap -c 查看字节码文件,发现所有的T都是Object。 这种将T全部替换为object的机制,在Java当中称之为擦除机制。同时Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。
好奇或者想要深入了解擦除机制的小伙伴可以查阅资料,我们就不深入探究该机制了!

4.2提出问题

为什么,T[] ts = new T[5]; 是不对的,编译的时候,替换为Object,不是相当于:Object[] ts = new Object[5]吗?

这个问题留给大家自行思考吧,感兴趣的私信博主讨论这个问题呦!

五、泛型上界

泛型有时候因为能传入的类型太广泛也会造成一些不必要的麻烦,于是我们就需要对传入的类型做一个限制,这种限制我们称之为:泛型的上界

5.1语法

class 泛型类名称<类型形参 extends 类型边界> {...
}

5.2实例

public class MyArray<E extends Number> {//只接受 Number 的子类型作为 E 的类型实参...
}MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型
MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型

注:没有指定类型边界 E,可以视为 E extends Object

泛型进阶

今天这篇文章只是带我们去简单的认识一下泛型,有关泛型方法、通配符、泛型接口等等一系列进阶知识,博主会在泛型进阶篇深入分析讲解,也许有些小伙伴意犹未尽,博主也是,但泛型的掌握不能急于一时,我们从简单的开始,后续再深入学习泛型,相信会有更好的学习效果!

相关文章:

Java简单认识泛型——图文详解

写在开头:想必大家和博主一样&#xff0c;在以往学习JavaSE的语法中&#xff0c;遇到了一个陌生的词——泛型&#xff0c;博主当时很好奇&#xff0c;什么是泛型呢&#xff1f;即使是学完了JavaSE&#xff0c;这个问题都没有解决&#xff0c;只能在百度查阅了解关于泛型的一些皮…...

AcWing171.送礼物

题目描述 达达帮翰翰给女生送礼物&#xff0c;翰翰一共准备了NNN 个礼物&#xff0c;其中第 iii 个礼物的重量是 G[i]G[i]G[i]。 达达的力气很大&#xff0c;他一次可以搬动重量之和不超过 WWW 的任意多个物品。 达达希望一次搬掉尽量重的一些物品&#xff0c;请你告诉达达在…...

领域驱动设计-架构篇

目录 1、软件架构概述 1.1 软件架构概念 1.2 软件架构分类 1.3 软件架构模式 1.4 软件架构风格 2、领域驱动软件架构 2.1 架构风格 六边行架构&#xff08;领域驱动设计首选&#xff09; 为什么选择REST架构 松耦合 可伸缩性 易用性 约束性 2.2 架构模型 命令和…...

docker安装kafka

前言最近在用kafka做项目&#xff0c;所以本地搭建下kafka&#xff0c;但是又嫌java安装和安装kafka太麻烦&#xff0c;所以想到用docker来部署。镜像wurstmeister/kafka维护较为频繁的一个Kafka镜像。只包含了Kafka&#xff0c;因此需要另行提供ZooKeeper&#xff0c;推荐使用…...

Selenium4+Python3系列(十一) - Page Factory设计模式

写在前面&#xff1a; Page Object模式&#xff0c;目的是将元素定位和元素操作分层&#xff0c;只接触测试内容&#xff0c;不写基础内容&#xff0c;便于后续对自动化测试用例体系的维护&#xff0c;这是中心思想&#xff0c;也是核心。 那么我们继续将简洁延续&#xff0c…...

C++基础知识【4】函数及参数

目录 一、函数的基本概念 1.1、构成 1.2、声明和定义 1.3、函数的调用 二、参数 2.1、形参和实参 2.2、参数的传递 传值 传引用 传指针 三、C函数的一些新特性 3.1、Lambda表达式 3.2、右值引用 3.3、默认参数 3.4、变长参数模板 3.5、constexpr函数 3.6、noex…...

约瑟夫森磁效应

电流与波函数的相位有直接的关系&#xff0c;可得约瑟夫森结的电流为 IIcsinϕ\begin{align} II_c sin\phi \end{align} IIc​sinϕ​​ 式中&#xff0c;IcI_cIc​为临界电流&#xff0c;相位差为ϕϕ2−ϕ1\phi\phi_2-\phi_1ϕϕ2​−ϕ1​。 根据磁矢势A的定义&#xff0c;B…...

什么是L1和L2正则化,以及它们有什么区别

一、L1和L2正则化是什么&#xff1f; 在防止过拟合的方法中有L1正则化和L2正则化&#xff0c;L1和L2是正则化项&#xff0c;又叫做惩罚项&#xff0c;是为了限制模型的参数&#xff0c;防止模型过拟合而加在损失函数后面的一项。 在二维的情况下&#xff0c;黄色的部分是L2和…...

场景式消费激发春日经济,这些电商品类迎来消费热潮

春日越临近&#xff0c;商机越浓郁。随着气温渐升&#xff0c;春日经济已经潜伏在大众身边。“春菜”、“春装”、“春游”、“春季养生”等春日场景式消费走热。 下面&#xff0c;鲸参谋为大家盘点几个与春日经济紧密相关的行业。 •春日仪式之春游踏青 ——户外装备全面开花…...

[2.1.4]进程管理——进程通信

文章目录第二章 进程管理进程通信&#xff08;IPC&#xff09;为什么进程通信需要操作系统支持&#xff1f;&#xff08;一&#xff09;共享存储&#xff08;1&#xff09;基于存储区的共享&#xff08;2&#xff09;基于数据结构的共享&#xff08;二&#xff09;消息传递什么…...

ChatGPT也有犯晕的时候

前面测试 ChatGPT 进行写代码、优化代码、解释代码、一般问答都表现的很好。偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f;代码看不懂&#xff1f;ChatGPT 帮你解释&#xff0c;详细到爆&…...

机器学习与目标检测作业:连通块算法

机器学习与目标检测作业&#xff1a;连通块算法一、连通块算法题目描述二、连通块算法文件结构三、连通块算法程序编写3.1、连通块算法conBlock.h头文件内容3.2、conBlock.cpp源文件内容3.3.3、mian.h头文件内容3.3.4、main.cpp源文件内容如下四、连通块算法程序运行结果一、连…...

HBase基础 --- 增删查改

目录 创建表 查看指定表全名空间中的表 查看表描述 禁用/启用 查看禁用/启动状态 删除表 新增列族 删除列族 更改列族存储版本的限制 增加数据 根据条件查询 查看指定列中不同版本的数据 删除指定列族下的指定列 删除指定行 全表扫描 全表扫描指定列族…...

如何基于AI智能视频技术实现公园景区的人流量实时统计?

一、方案背景春暖花开的季节来临&#xff0c;外出旅游的人群也越来越多。无论是景区、公园、博物馆、步行街等场所&#xff0c;客流超载非常大&#xff0c;给游客带来的体验较差&#xff0c;同时也存在安全隐患。当前景区面临的管理痛点包括&#xff1a;客流信息查询难&#xf…...

【JavaWeb】Servlet详解

文章目录1. 前置知识2.servlet生命周期2.1 默认情况下&#xff0c;服务器启动时&#xff0c;servlet对象并没有被创建2.2 用户执行一次请求2.3用户执行第二次请求2.4 3,4,5,6....次请求2.5 关闭服务器3.servlet方法解析4.适配器模式改造servlet4.1不使用servlet模式4.2使用适配…...

谁是世界上最好的编程语言?--编程语言70年浅谈

1、编程语言发展史纵览 严谨起见&#xff0c;本文提到的编程语言指的是「第三代高级编程语言」。 首先&#xff0c;我们从时间维度入手聊聊编程语言。一图胜千言&#xff0c;我们从目前主流的编程语言中&#xff0c;挑选出流行的、具有历史影响力的语言。把它们按时间从上往下…...

Webpack前端资源加载/打包工具

文章目录一、Webpack1、什么是Webpack2、Webpack安装2.1全局安装2.2安装后查看版本号3、创建项目3.1初始化项目3.2创建src文件夹3.3 src下创建common.js3.4 src下创建utils.js3.5 src下创建main.js4、JS打包4.1创建配置文件4.2执行编译命令4.3创建入口页面4.4测试5、CSS打包5.1…...

springcloud3 fegin实现服务调用1

一 Fegin的作用 1.1 fegin的作用 fegin是一个声明式的web服务客户端&#xff0c;让编写web服务器客户端变得非常容易&#xff0c;只需创建一个接口并在接口中添加FeginClients注解即可。 Fegin的使用方式&#xff1a;使用fegin的注解定义接口&#xff0c;调用这个接口&#…...

专业版即将支持自定义场景测试

物联网 MQTT 测试云服务 XMeter Cloud 专业版于 2022 年底上线后&#xff0c;已有不少用户试用&#xff0c;对数千甚至上万规模的 MQTT 并发连接和消息吞吐场景进行测试。同时我们也收到了希望支持更多物联网协议测试的需求反馈。 新年伊始&#xff0c;XMeter 团队全力聚焦于 …...

Process Monitor工具使用实验(23)

实验目的 学习Process Monitor实用小工具的使用&#xff0c;学会利用Process Monitor工具观察程序进程/线程、文件系统、注册表、网络连接等的活动。预备知识 Process Monitor是一个Windows系统下先进的监视工具&#xff0c;它可以显示文件系统、注册表、网络连接、进程…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...