数据结构 - 泛型

目录

前言

1. 什么是泛型?

2. 为什么需要泛型?

引入泛型之前

引入泛型之后

3.泛型类

4.泛型的界限

1.上下界

2.通配符


前言

今天给大家介绍一下泛型的使用


1. 什么是泛型?

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。

                                                                                      ----- 来源《Java编程思想》对泛型的介绍。

泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

2. 为什么需要泛型?

引入泛型之前

我们不妨先来看一个例子

目前来看一切正常,你可能还会说: 这不是挺好的吗?

我只能说: 别急

多态的弊端是无法访问子类的特有功能

现在你感觉如何?

虽然在这种情况下,当前集合任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

引入泛型之后

可以看到,编译直接报错.需要被提供的类型和真实提供的类型不匹配!
泛型是在jdk5引入的,在jdk7时为了简化开发,java7增加了一个语言特性,称为菱形运算符<>

ArrayList<String> list = new ArrayList<>();

3.泛型类

应用场景: 当一个类中,某个变量的类型不确定时,就可以定义带有泛型的类

上面的例子中的ArrayList就是通过泛型来实现的

此处的E可以理解为变量,用来记录数据的类型(字母可以随意定义,常用为E,T,V,K,

E 表示 Element K 表示 Key V 表示 Value N 表示 Number T 表示 Type)

除了泛型类之外,还有泛型方法和泛型接口,和泛型类没什么本质区别,大家自行了解即可。

4.泛型的界限

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

1.上下界

在Java的泛型中,可以使用上界(Upper Bounds)和下界(Lower Bounds)来限制泛型类型的范围。

上界使用extends关键字来定义,表示泛型类型必须是指定类或其子类。例如,T extends Number表示T必须是Number类或其子类。在使用上界时,可以使用多个上界,使用逗号分隔。例如,T extends Number & Comparable表示T必须是Number类及其子类,并且实现了Comparable接口。

下界使用super关键字来定义,表示泛型类型必须是指定类或其父类。例如,T super Integer表示T必须是Integer类或其父类。

使用上界和下界可以提供更加灵活的泛型类型限制,使得泛型类型可以满足特定的要求。例如,使用上界可以确保泛型类型具有某些特定的方法或属性,而使用下界可以确保泛型类型可以接受某些类型的参数。

2.通配符

通配符(Wildcard)是Java泛型中的一种特殊符号,用于表示未知类型。

通配符有两种形式:?? extends T

?表示任意类型,可以用来表示不确定的类型。

? extends T表示类型的上界,表示泛型类型必须是T类型或其子类。

通配符可以用于方法的参数类型、返回类型、变量类型等位置,通过使用通配符,可以使泛型更加灵活和通用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142731.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java高级应用——异常处理

文章目录 异常处理概念Java异常体系Error 和 Exception编译时异常和运行时异常Java异常处理的方式 异常处理 概念 异常处理是在程序执行过程中遇到错误或异常情况时的一种机制&#xff0c;它允许程序在错误发生时进行适当的处理&#xff0c;而不会导致程序崩溃或产生不可预测…

【办公自动化】用Python将PDF文件转存为图片(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【嵌入式】使用嵌入式芯片唯一ID进行程序加密实现

目录 一 背景说明 二 原理介绍 三 设计实现 四 参考资料 一 背景说明 项目程序需要进行加密处理。 考虑利用嵌入式芯片的唯一UID&#xff0c;结合Flash读写来实现。 加密后的程序&#xff0c;可以使得从芯片Flash中读取出来的文件&#xff08;一般为HEX格式&#xff09;不能…

rsync+inotify实时同步数据

一、相关简介 1、rsync&#xff08;remote synchronize&#xff09; rsync是 Liunx/Unix 下的一个远程数据同步工具&#xff0c;它可通过 LAN/WAN 快速同步多台主机间的文件和目录。   Linux 之间同步文件一般有两种方式&#xff0c;分别是 rsync 与 scp &#xff0c;scp 相…

前端性能优化汇总

1.减少HTTP请求次数和请求的大小 &#xff08;三大类&#xff09; 文件的合并和压缩&#xff1a;&#xff08;1&#xff09;&#xff08;6&#xff09; 延迟加载&#xff1a;&#xff08;3&#xff09;&#xff08;4&#xff09; 用新的文件格式代替传统文件格式&#xff1a;&a…

基于LQR算法的一阶倒立摆控制

1. 一阶倒立摆建模 2. 数学模型 倒立摆的受力分析网上有很多&#xff0c;这里就不再叙述。直接放线性化后的方程&#xff1a; F (Mm)x″-mLφ″ (ImL)φ″ mLx″ mgLφ&#xff08;F为外力&#xff0c;x为物块位移&#xff0c;M&#xff0c;m为物块和摆杆的质量&#xff0c;…

抽象轻松java

嗨嗨嗨&#xff01; 没想到吧&#xff0c;出现了抽象轻松第4种语言系列&#xff08;我也没想到&#xff09; 简单的java程序&#xff0c;看完就懂的简单逻辑——购物车系统 购物车&#xff0c;首先要有商品吧&#xff0c;现实中的商品有什么属性&#xff1f; 名字&#xff0…

CSS详细基础(一)选择器基础

本帖开始&#xff0c;我们来介绍CSS——即&#xff0c;层叠样式表~ 层叠样式表是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。简单的说&#xff0c;层叠就是对一个元…

PostgreSQL 查询某个属性相同内容出现的次数

查询某个数据库表属性 name 相同内容出现出现的次数&#xff0c;并按次数从大到小排序 SELECT name, COUNT(*) AS count FROM your_table GROUP BY name ORDER BY count DESC;示例 select project_id, COUNT(*) AS count from app_ads_positions group by project_id order b…

认证-authentication 和授权-authorization

就好比你可以刷卡进去xxx大厦&#xff08;认证是本公司职员&#xff09;&#xff0c;但无法刷卡进入金融部门&#xff0c;或 实验部门&#xff08;因为没有授权&#xff09;

vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗

文章目录 vite的proxy开发环境设置如果后端没有提供可以替换的/mis等可替换的后缀的处理办法接口如何区分.env.development开发和.env.production生产环境接口在生产环境下&#xff0c;还能使用proxy代理地址吗&#xff1f; vite的proxy开发环境设置 环境&#xff1a; vite 4…

玩转Mysql系列 - 第22篇:mysql索引原理详解

这是Mysql系列第22篇。 背景 使用mysql最多的就是查询&#xff0c;我们迫切的希望mysql能查询的更快一些&#xff0c;我们经常用到的查询有&#xff1a; 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录&#xff08;between and&#xff09; …

忽视日志吃大亏,手把手教你玩转 SpringBoot 日志

一、日志重要吗 程序中的日志重要吗&#xff1f; 在回答这个问题前&#xff0c;笔者先说个事例&#xff1a; ❝ 笔者印象尤深的就是去年某个同事&#xff0c;收到了客户反馈的紧急bug。尽管申请到了日志文件&#xff0c;但因为很多关键步骤没有打印日志&#xff0c;导致排查进…

win10 使用cmake + mingw编译LAPACK

参考官网的内容: 适用于视窗的 LAPACK (utk.edu) 第一步下载好源码包: 配置好mingw的路径添加到环境变量中 gcc --version 出现这些就行了. 还有就是吧mingw中的mingw-make.exe重命名为make.exe 下载安装cmake 然后打开 1是源码路径,路径中一定要有CMakeLists.txt如果没…

Java多线程篇(6)——AQS之ReentrantLock

文章目录 1、管程2、AQS3、ReentrantLock3.1、lock/unlock3.1.1、lock3.1.2、unlock 3.2、一些思考 1、管程 什么是管程&#xff1f; 管理协调多个线程对共享资源的访问&#xff0c;是一种高级的同步机制。 有哪些管程模型&#xff1f; hansen&#xff1a;唤醒其他线程的代码…

渗透测试中的前端调试(一)

前言 前端调试是安全测试的重要组成部分。它能够帮助我们掌握网页的运行原理&#xff0c;包括js脚本的逻辑、加解密的方法、网络请求的参数等。利用这些信息&#xff0c;我们就可以更准确地发现网站的漏洞&#xff0c;制定出有效的攻击策略。前端知识对于安全来说&#xff0c;…

Pytorch单机多卡分布式训练

Pytorch单机多卡分布式训练 数据并行&#xff1a; DP和DDP 这两个都是pytorch下实现多GPU训练的库&#xff0c;DP是pytorch以前实现的库&#xff0c;现在官方更推荐使用DDP&#xff0c;即使是单机训练也比DP快。 DataParallel&#xff08;DP&#xff09; 只支持单进程多线程…

3、嵌入式系统的启动过程(BoodLoader)

1、系统启动过程 通电 - > 执行BootLoader - > 加载内核 - > 挂在根文件系统 - > 执行应用程序 Windows的启动过程&#xff1a; 通电 - > 执行BIOS - > 加载WinNT内核 - > 挂在文件系统 - > 执行应用程序 二、嵌入式系统的结构 BootLoader 1、BootL…

ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合

目录 一、数据聚合 1.1、基本概念 1.1.1、聚合分类 1.1.2、特点 1.2、DSL 实现 Bucket 聚合 1.2.1、Bucket 聚合基础语法 1.2.2、Bucket 聚合结果排序 1.2.3、Bucket 聚合限定范围 1.3、DSL 实现 Metrics 聚合 1.4、基于 JavaRestClient 实现聚合 1.4.1、组装请求 1…

Tomcat多实例、负载均衡、动静分离

Tomcat多实例部署 安装jdk [rootlocalhost ~]#systemctl stop firewalld.service [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#cd /opt [rootlocalhost opt]#ls apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz rh [rootlocalhost opt]#tar xf jdk-8u91-linu…