java泛型5

news2024/9/21 9:17:06

泛型类
Java泛型不仅允许在使用通配符形参时设定上限,而且可以在定义泛型形参时设定上限,用于表示传给该泛型形参的实际类型要么是该上限类型,要么是该上限类型的子类。
在这里插入图片描述
上面程序定义了一个Apple泛型类,该Apple类的泛型形参的上限是Number类,这表明使用Apple类时为T形参传入的实际类型参数只能是Number或Number类的子类。上面程序在①处将引起编译错误:类型T的上限是Number类型,而此处传入的实际类型是String类型,既不是Number类型,也不是Number类型的子类型,所以将会导致编译错误。
在一种更极端的情况下:
程序需要为泛型形参设定多个上限(至多有一个父类上限,可以有多个接口上限),表明该泛型形参必须是其父类的子类(是父类本身也行),并且实现多个上限接口。
在这里插入图片描述
与类同时继承父类、实现接口类似的是,为泛型形参指定多个上限时,所有的接口上限必须位于类上限之后。也就是说,如果需要为泛型形参指定类上限,类上限必须位于第一位。

泛型方法
在定义类、接口时可以使用泛型形参,在该类的方法定义和成员变量定义、接口的方法定义中,这些泛型形参可被当成普通类型来用。在另外一些情况下,定义类、接口时没有使用泛型形参,但定义方法时想自己定义泛型形参,这也是可以的,Java 5还提供了对泛型方法的支持。
自定义定义泛型方法
假设需要实现这样一个方法:该方法负责将一个Object数组的所有元素添加到一个Collection集合中。考虑采用如下代码来实现该方法
在这里插入图片描述
上面定义的方法没有任何问题,关键在于方法中的c形参,它的数据类型是 Collection 。 其中Collection不是Collection的子类型—所以这个方法的功能非常有限,它只能将Object[]数组的元素复制到元素为Object(Object的子类不行)的Collection集合中,即下面代码将引起编译错误。
在这里插入图片描述
可见上面方法的参数类型不可以使用Collection,那使用通配符Collection<?>是否可行呢?显然也不行,因为Java不允许把对象放进一个未知类型的集合中。
为了解决这个问题,可以使用Java 5提供的泛型方法(Generic Method)。所谓泛型方法,就是在声明方法时定义一个或多个泛型形参。泛型方法的语法格式如下:
在这里插入图片描述
把上面方法的格式和普通方法的格式进行对比,不难发现泛型方法的方法签名比普通方法的方法签名多了泛型形参声明,泛型形参声明以尖括号括起来,多个泛型形参之间以逗号(,)隔开,所有的泛型形参声明放在方法修饰符和方法返回值类型之间。
采用支持泛型的方法,就可以将上面的fromArrayToCollection方法改为如下形式:
在这里插入图片描述

完整例子
在这里插入图片描述
上面程序定义了一个泛型方法,该泛型方法中定义了一个T泛型形参,这个T类型就可以在该方法内当成普通类型使用。与接口、类声明中定义的泛型不同的是,方法声明中定义的泛型只能在该方法里使用,而接口、类声明中定义的泛型则可以在整个接口、类中使用。
与类、接口中使用泛型参数不同的是,方法中的泛型参数无须显式传入实际类型参数,如上当调用fromArrayToCollection()方法时,无须在调用该方法前传入String、Object等类型,但系统依然可以知道为泛型实际传入的类型,因为编译器根据实参推断出泛型所代表的类型,它通常推断出最直接的类型。例如,下面调用代码:
在这里插入图片描述

上面代码中cs是一个Collection类型,与方法定义时的fromArrayToCollection(T[] a,Collectionc)进行比较—只比较泛型参数,不难发现该T类型代表的实际类型是String类型。对于如下调用代码:
在这里插入图片描述

上面的cn是Collection类型,与此方法的方法签名进行比较—只比较泛型参数,不难发现该T类型代表了Number类型。

反面教材
在这里插入图片描述
上面程序中定义了test()方法,该方法用于将前一个集合里的元素复制到下一个集合中,该方法中的两个形参from、to的类型都是Collection,这要求调用该方法时的两个集合实参中的泛型类型相同,否则编译器无法准确地推断出泛型方法中泛型形参的类型。
上面程序中调用test方法传入了两个实际参数,其中as的数据类 型是List,而ao的数据类型是List,与泛型方法签名进行对比:test(Collection a, Collection c),编译器无法正确识别T所代表的实际类型。怎么优化呢?
在这里插入图片描述
上面代码改变了test()方法签名,将该方法的前一个形参类型改为Collection<? extends T>,这种采用类型通配符的表示方式,只要test() 方法的前一个Collection集合里的元素类型是后一个Collection集合里元素类型的子类即可。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免安装PortableGit配置 + TortoiseGit安装

文章目录官网/安装Git将git命令添加到Path环境变量添加GitHub登录账号下载安装TortoiseGit官网/安装Git Git官网&#xff1a;https://git-scm.com/ 国内用户&#xff0c;建议通过淘宝镜像网站下载安装文件&#xff1a; https://registry.npmmirror.com/binary.html?pathgit…

18.异常

目录 一.异常 1.1 什么是异常 1.2 为什么要学习异常 1.3 异常的体系 1.5 编译时异常 1.5.1 什么是编译时异常 1.5.2 编译时异常的作用 1.5.3 常见编译时异常 1.6 运行时异常 1.6.1 什么是运行时异常 1.6.2 常见运行时异常 1.6 异常的默认处理流程&#xff08;RunTim…

web3:区块链常见的几大共识机制及优缺点

web3相关学习一并收录至该博客&#xff1a;web3学习博客目录大全 胡歌看了都得给我一键三连吧&#xff01; 目录什么是共识&#xff1f;什么是共识机制&#xff1f;共识机制的目标为什么需要共识机制?如何评价一个共识机制的优劣:共识机制分类PoW( Proof of Work)工作量证明&a…

2023年最新!北京Java培训机构排行榜新鲜出炉!

北京作为中国的首都&#xff0c;其人才的需求的体量之大是其他城市不可比的。那么在北京学习Java&#xff0c;到底该怎么选择Java培训机构哪?怎么在众多的机构里面选择出最适合自己的哪&#xff1f;下面是小编根据口碑和实力整理出的北京Java培训机构排行榜单&#xff0c;仅供…

【Effective_Objective-C_6 块block】

文章目录前言GCD和块的简介37.理解块的概念块的基础知识块可以捕获变量内联块的用法块的内部结构全局块&#xff0c;栈块&#xff0c;堆块堆块全局块要点38.为常用的块类型创建typedef要点39.用handler块降低代码分散程度协议传值实现异步块实现异步回调操作里的块要点40.用块引…

说说redux的实现原理是什么,写出核心代码?

目录标题一、redux三大基本原则是&#xff1a;二、实现原理&#xff1a;三、如何使用一、redux三大基本原则是&#xff1a; 单一数据源state是只读的使用纯函数来执行修改 注意的是&#xff0c;redux并不是只应用在react中&#xff0c;还与其他界面库一起使用&#xff0c;如V…

3.26 haas506 2.0开发教程-example- 串口控制ESP32-CAM OV2640拍照

haas506串口控制ESP32-CAM OV2640拍照介绍ESP32-CAM开发板硬件连接代码流程代码ESP32-CAM开发板代码HaaS506开发板代码测试ESP32-CAM开发板测试介绍 通过HaaS506串口发送指令&#xff0c;控制ESP32-CAM进行拍照&#xff0c;并将照片储存在SD卡中。ESP32-CAM需要5V供电才能正常…

小程序开发常见问题总结(超实用)

小程序开发常见问题总结&#xff08;超实用&#xff09; 文章目录小程序开发常见问题总结&#xff08;超实用&#xff09;1.小程序user agent stylesheet问题。2.this.setData is not function错误3.flex布局3.1flex布局原理3.2flex父项属性3.3flex布局子项元素4.自定义组件1.在…

白银k线图基础知识梳理:包覆形态

伦敦银价格走势是国际市场上所有参与者多方合力的结果&#xff0c;这些参与者包括银行、白银商、期货交易商、对冲基金等金融机构、各种法人机构以及个人投资者。一根简单的K线&#xff0c;能够把所有市场参与者博弈的结果展示出来&#xff0c;并且反映出银价运行和变化的各个细…

node后端接收到axios的post请求体为空

node后端接收到axios的post请求体为空&#xff1f;&#xff1f;&#xff1f; 使用axios发送post请求&#xff0c;传入了Object格式的参数&#xff0c;在node后端req.body接收到的参数为空&#xff0c;但是网页上抓包检查时&#xff0c;发现请求的body确实是携带了参数的&#x…

【工具】2023开年利器,重写收藏逻辑和内置白板应用的Arc浏览器

目录一、为什么你需要一款新的浏览器&#xff1f;二、重写的收藏夹逻辑三、自带笔记和白板的浏览器四、如何获得Arc浏览器一、为什么你需要一款新的浏览器&#xff1f; 人生漫漫&#xff0c;三年混乱。在经历了这些起伏之后&#xff0c;你一定有一个不断进取的决心。 工欲善其…

如何设置将SAP红灯报错改为黄灯(OBA5 更改消息控制 )

在SAP的业务操作中或者后台配置经常遇到SAP校验报红灯的错误导致业务进行不下去。可以通过OBA5 更改消息控制事务修改消息报错类型&#xff0c;例如把红灯报错改为黄灯&#xff0c;这样业务就可以进行下去了。 举两个例子来说明一下如何配置。 目录 例子1&#xff1a;固定资…

【stl -- 内建函数对象】

目录&#xff1a;前言一、仿函数二、算数仿函数三、关系仿函数四、逻辑仿函数总结前言 概念 stl内建了一些仿函数 分类 算数仿函数、 关系仿函数、 逻辑仿函数 用法 这些仿函数所产生的对象&#xff0c;用法和普通函数完全一样&#xff1b; 使用内建仿函数需要包含头文件 一、…

拉伯证券|A股大涨!外资30分钟爆买百亿!汽车股狂飙

在很多利好音讯的轮番影响下&#xff0c;兔年首个交易日&#xff0c;A股迎来大涨。沪指开盘便站上3300点整数关口&#xff0c;尔后继续高位震动。深证成指、创业板指涨势更甚&#xff0c;到午盘涨幅均超1.5%。 外资继续“高调”抢筹。Choice数据显现&#xff0c;今天开盘仅5分…

Maven基础学习——依赖管理

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JavaWeb Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&…

18个 SpringBoot项目中遇到的BUG,你试试

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 1.启动项目的时候报错 1.E…

从零到一,臻于至善|网易邮箱基于StarRocks 开发大数据平台的实践

作者&#xff1a;网易邮箱 黄贤康。现任职网易邮件事业部资深数据开发工程师&#xff0c;作为主要开发人员参与网易邮箱大数据平台的建立、优化、重构等工作&#xff0c;并取得相当的成效。他长期从事服务端应用及大数据领域的架构研发工作&#xff0c;对相关领域的底层架构、开…

什么是一站式人力资源管理系统?

首先什么是人力资源管理系统&#xff1f;简单来讲&#xff0c;人力资源管理系统就是帮助企业人力资源部门进行日常管理的辅助工具。人力资源部门通常需要负责企业员工管理的各个方面&#xff0c;无论是招聘&#xff0c;培训&#xff0c;考勤还是薪资绩效&#xff0c;都需要企业…

Jmeter使用手册

Jmeter使用手册Jmeter使用手册1.Jmeter安装教程下载地址Jmeter环境变量配置启动应用实例1.Jmeter安装教程下载地址https://jmeter.apache.org/download_jmeter.cgiJmeter环境变量配置新建变量名称:JMETER_HOME值为:D:\work_tools\apache-jmeter-5.5添加到path:%JMETER_HOME%\bi…

服务器应该如何做好防护以及被攻击之后如何处理

服务器是每个软件运行的基础&#xff0c;也是运行过程中最重要的一部分&#xff0c;所以在运行的过程中&#xff0c;服务器会受到黑客的不法攻击&#xff0c;那么服务器我们应该如何做好防护以防被攻击呢&#xff01;接下来小蚁君给大家一一讲解。首先可以安装最新的安全补丁&a…