java泛型4

news2024/11/24 20:33:35

通配符之设定类型通配符的上限-------什么时候需要设置上限????协变
在这里插入图片描述
还差一个Canvas类
在这里插入图片描述
这样定义行不行?不行!!!
测试一下:
在这里插入图片描述
注意上面的drawAll()方法的形参类型是List , 而List 并不是List的子类型,因此,下面代码将引起编译错误。也就是说List 并不是List的子类型,所以不能把List 对象当成List使用。为了表示List 的父类,可以考虑使用List<?>,但此时从List<?>集合中取出的元素只能被编译器当成Object处理。为了表示List集合的所有元素是Shape的子类,Java泛型提供了被限制的泛型通配符。被限制的泛型通配符表示如下:
在这里插入图片描述
那就可以改写一下:
在这里插入图片描述
将Canvas改为如上形式,就可以把List 对象当成List<? extends Shape> 使用。 即List<? extends Shape> 可以表示List 、List的父类—-只要List后尖括号里的类型是Shape的子类型即可。
List<? extends Shape>是受限制通配符的例子,此处的问号(?)代表一个未知的类型,就像前面看到的通配符一样。但是此处的这个未知类型一定是Shape的子类型(也可以是Shape本身),因此可以把Shape称为这个通配符的上限(upper bound)。
类似地,由于程序无法确定这个受限制的通配符的具体类型,所以不能把Shape对象或其子类的对象加入这个泛型集合中。例如,下面代码就是错误的。
在这里插入图片描述
与使用普通通配符相似的是,shapes.add()的第二个参数类型是?extends Shape,它表示Shape未知的子类,程序无法确定这个类型是什么,所以无法将任何对象添加到这种集合中。
简而言之,这种指定通配符上限的集合,只能从集合中取元素 (取出的元素总是上限的类型或其子类),不能向集合中添加元素(因为编译器没法确定集合元素实际是哪种子类型)。
对于更广泛的泛型类来说,指定通配符上限就是为了支持类型型变。比如Foo是Bar的子类,这样A就相当于A<? extends Bar>的 子类,可以将A赋值给A<? extends Bar>类型的变量,这种型变方式被称为协变。
对于协变的泛型而言,它只能调用泛型类型作为返回值类型的方法(编译器会将该方法返回值当成通配符上限的类型);而不能调用泛型类型作为参数的方法。口诀是:协变只出不进!
提示:
没有指定通配符上限的泛型类,相当于通配符上限是Object。

那么反过来讲,有下限?有!!!
通配符之设定类型通配符的下限-------什么时候需要设置下限????逆变
通配符的下限用<? super类型>的方式来指定,通配符下限的作用与通配符上限的作用恰好相反。指定通配符的下限就是为了支持类型型变。比如Foo是Bar的子类,当程序需要一个A<? super Foo>变量时,程序可以将A、A赋值给A<? super Foo>类型的变量,这种型变方式被称为逆变。
对于逆变的泛型集合来说,编译器只知道集合元素是下限的父类型,但具体是哪种父类型则不确定。因此,这种逆变的泛型集合能向其中添加元素(因为实际赋值的集合元素总是逆变声明的父类),从集合中取元素时只能被当成Object类型处理(编译器无法确定取出的到底是哪个父类的对象)。
对于逆变的泛型而言,它只能调用泛型类型作为参数的方法;而不能调用泛型类型作为返回值类型的方法。口诀是:逆变只进不出!
假设自己实现一个工具方法:
实现将src集合中的元素复制到dest集合的功能,因为dest集合可以保存src集合中的所有元素,所以dest集合元素的类型应该是src集合元素类型的父类。对于复制方法,可以这样理解两个集合参数之间的依赖关系:不管src集合元素的类型是什么,只要dest集合元素的类型与前者相同或者是前者的父类即可,此时通配符的下限就有了用武之地。下面程序采用通配符下限的方式来实现该copy()方法。
在这里插入图片描述
使用这种语句,就可以保证程序的①处调用后推断出最后一个被复制的元素类型是Integer,而不是笼统的Number类型。

引申:
Java集合框架中的TreeSet有一个构造器也用到了这种设定通配符下限的语法。
在这里插入图片描述
TreeSet会对集合中的元素按自然顺序或定制顺序进行排序。如果需要TreeSet对集合中的所有元素进行定制排序,则要求TreeSet对象有一个与之关联的Comparator对象。上面构造器中的参数c就是进行定制排序的Comparator对象。
同时其实Comparator接口也是一个带泛型声明的接口:
在这里插入图片描述
通过这种带下限的通配符的语法,可以在创建TreeSet对象时灵活地选择合适的Comparator。假定需要创建一个TreeSet集合,并传入一个可以比较String大小的Comparator,这个Comparator既可以是Comparator,也可以是Comparator—只要尖括号里传入的类型是String的父类型(或它本身)即可。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

好的直线导轨应该具备哪些要求?

直线导轨运用于各行各业&#xff0c;范围非常之广&#xff0c;但是对于直线导轨的要求都是大同小异的&#xff0c;下面我们来看下良好的直线导轨都应具备哪些要求&#xff1f; 1>运动灵敏度与定位精度高&#xff1a;定位精度是指运动构件能按要求停止在指定位置的能力。运动…

musl pwn 入门 (4)

在前面的介绍中&#xff0c;我们学习了musl pwn的基本原理&#xff0c;下面我们就通过一道经典例题进一步巩固。 这是DefCon Quals 2021中的一道题mooosl&#xff0c;直接在github上搜这道题的名字就可以找到作者发布的附件&#xff0c;内含说明、作者的exp、源码以及二进制程…

Linux系统之openEuler安装部署

Linux系统之openEuler安装部署一、openEuler介绍1.openEuler简介2.openEuler的硬件要求①物理机的安装要求②虚拟机的安装要求二、下载openEuler系统镜像1.官方网址2.下载openEuler系统镜像三、虚拟机配置工作1.设置虚拟机名称2.处理器配置3.设置虚拟机内存4.设置网络类型5.磁盘…

电脑桌面壁纸不清晰?壁纸模糊怎么修复高清?

我们在入手新电脑之后&#xff0c;首先就是会想要设置一个好看的壁纸&#xff0c;虽然系统会自带一些壁纸&#xff0c;但大多数用户都不喜欢这样一成不变的壁纸。于是在网上找了很好好看的壁纸换上&#xff0c;结果发现在更换电脑壁纸之后却发现壁纸显示非常的模糊不清。为什么…

git中gitignore忽略文件规则配置

我们在日常开发中会遇见项目打包的情况&#xff0c;然后这时候我们想要打包完成后提交一次代码&#xff0c;会忘记删除dist文件或者打包文件&#xff0c;会跟着提交上去&#xff0c;这样就造成了协同开发的麻烦&#xff0c;也会造成codeReview的障碍&#xff0c;让别人在拉取代…

CNN平移不变性

目录 .1 简介&#xff1a; 1.1什么是平移不变性 1.2 平移不变性/平移同变性 1.3 为什么卷积神经网络具有平移不变性 总结 1.4 证伪&#xff1a;CNN中的图片平移不变性 .2 实例 references&#xff1a; .1 简介&#xff1a; 1.1什么是平移不变性 不变性 不变性意味着即…

跟风试试ChatGPT

文章目录前言什么是ChatGPTChatGPT怎么玩注册验证使用设计型开发型强人所难型Python调用ChatGPT总结前言 其实现在也不算是跟风了&#xff0c;从 ChatGPT 出现至今已经有几个月的时间&#xff0c;这股风似乎已经刮过去了&#xff0c;虽然各种新闻铺天盖地&#xff0c;但因为懒…

RHCE(远程连接服务器)

文章目录一、远程连接服务器简介1、什么是远程连接服务器2、远程连接服务器的功能3、远程连接服务器的类型4、文字接口连接服务器二、连接加密技术简介1、版本协商阶段2、密钥和算法协商阶段会话密钥的生成3、认证阶段SSH提供两种认证方法&#xff1a;三、SSH远程连接服务简介1…

高阶数据结构之红黑树

文章目录红黑树红黑树的性质红黑树的定义红黑树的插入情况一&#xff1a;插入节点的父节点为红&#xff0c;祖父节点为黑&#xff0c;叔叔节点存在且为红情况二&#xff1a;当前节点的父节点为红&#xff0c;祖父节点为黑&#xff0c;叔叔节点不存在或者为黑红黑树的验证验证是…

Linux常用命令——read命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) read 从键盘读取变量值 补充说明 read命令从键盘读取变量的值&#xff0c;通常用在shell脚本中与用户进行交互的场合。该命令可以一次读取多个变量的值&#xff0c;变量和输入的值都需要使用空格隔开。在read命…

这些预测性维护的专业术语你都了解吗?

一、前言 随着时代的发展&#xff0c;越来越多的企业希望能够在对设备和系统无损的前提下&#xff0c;通过一系列的测试和分析来实现维护。这种维护工作是基于设备和系统本身的运行状态来安排实施的&#xff0c;被称为CBM&#xff08;Condition Based Maintenance&#xff09;…

Apache自带压力测试工具—ab

ab压力测试工具&#xff1a; ab全称为&#xff1a;apache bench 我们先来了解一下压力测试的概念&#xff1a; 吞吐率&#xff08;Requests per second&#xff09; 概念&#xff1a;服务器并发处理能力的量化描述&#xff0c;单位是reqs/s&#xff0c;指的是某个并发用户数…

【c++】模拟实现vector

一.vector的成员变量与迭代器vector里面可以存各种数据类型&#xff0c;所以必定会用到模板&#xff0c;假设vector的模板参数为T&#xff0c;那么T*这个指针封装后就是vector的迭代器和string的迭代器很像&#xff0c;只不过string确定存的是字符&#xff0c;所以迭代器直接是…

ubuntu20.04网络配置

安装net-toolssudo apt-get install net-tools2、ifconfig查看网卡设备其中flags表中&#xff1a;running表示正在使用中。查看设备核心网络路由表&#xff1a;route -nDestination目标网段或者主机Gateway网关地址&#xff0c;”*” 表示目标是本主机所属的网络&#xff0c;不…

【Vue2+Element ui通用后台】用户列表

文章目录新增用户用户列表新增用户 首先增加一个 ‘新增’ 按钮&#xff0c;点击弹出对话框来新增用户。弹出框可以使用 Element UI 的 Dialog对话框&#xff0c;其中 visible 表示是否显示 Dialog&#xff0c;支持 .sync 修饰符。我们点击新增按钮把这个标识置为 true&#x…

金山系不惧微软,前有WPS力扛Office,后有eversheet接力再战

金山软件作为国产互联网元老企业&#xff0c;这里出来的IT大佬不计其数&#xff0c;小米的雷军、逸趣网络的吴裔敏、甜瓜在线的朱勇......金山软件不屈不挠的企业文化&#xff0c;沉淀已久&#xff0c;造就一大批人才&#xff0c;甚至追溯到40年前。 1981年&#xff0c;张旋龙在…

IntelliJ IDEA 闪退的解决办法

场景 最近这idea闪退频率又多了不少 以前 几天一闪退 现在 一天N多次闪退 如下图 看这崩溃日志 这怎么顶 解决办法 查看崩溃日志 日志 1 日志2 日志3 可以看出现在生效的参数 Command Line: -Xms128m -Xmx750m -XX:ReservedCodeCacheSize512m -XX:IgnoreUnrecognized…

SCA技术进阶系列(一):SBOM应用实践初探

现代软件都是组装的而非纯自研。随着开源组件在数字化应用中的使用比例越来越高&#xff0c;混源开发已成为当前业内主流开发方式。开源组件的引入虽然加快了软件开发效率&#xff0c;但同时将开源安全问题引入了整个软件供应链。软件组成成分的透明性成为软件供应链安全保障的…

Flink检查点详解

说白了就是等你要处理的这个或这波数据被所有任务&#xff08;执行完所有算子&#xff09;处理完了 再做检查点保存&#xff08;下图就是三个数据都被map、sum处理完 就做检查点保存 source是读取数据的&#xff09; 下图只是一个检查点的保存过程&#xff08;拆解&#xff09…

Express框架中JWT基础 - 对称|非对称加密

在上一篇内容当中已经使用过了JWT(JSONWebToken)做验证登录&#xff0c;采用的是对称加密的方式&#xff0c;那么在本篇当中来进一步的讲解关于JWT的基础使用对称以及非对称加密&#xff1b;先来简单的回顾上一篇内容当中使用到的对称加密&#xff1a; 对称加密 首先是通过expr…