java中的泛型(三)——通配符

        在前面的文章中我们简要介绍了泛型的概念以及泛型类和泛型方法的使用。在介绍泛型时我们说过在在java中一般用E、T、K、V、N、?这几个字母和符号来表示泛型,对于前面的几个字符它们的使用没有区别,只要注意它们所代表的类型就好。而对于最后一个?号,它表示的是通配符,通配符一般用在类型不确定的情况之下,并且我们可以设定通配符的范围使得通配符所代表的类型在一定范围之内。

        通配符的使用格式其余的泛型类没有区别,只是要特别注意使用的情况。一下用一个例子来说明通配符的使用。在之前我们曾建立了一个泛型类,在这个泛型类中定义了一个泛型属性flag,现在我们再定义一个普通类ShowMsg,在这个类中我们定义一个方法showFlag,用于打印泛型类Generic中的属性flag。

        接下来建立一个测试类用于测试方法showFlag。由于showFlag方法是类ShowMsg中的方法,所以首先要实例化类ShowMsg,其次由于在方法showFlag中要传入一个泛型对象,所以也要实例化泛型对象。在这里,要注意我们在定义方法showFlag时已经确定了泛型的类型,比如我们在这个方发中将泛型定义为Integer,这时在实例化泛型对象的时候我们必须让泛型的类型也是Integer,不然我们就无法将实例化的对象传入showFlag方法中。就像如下的两张图片所示的结果一样,只要和方法中指定的泛型不同,那么就无法作为正确的参数传入。

        此外或许有人想到了一点,那就时java中存在子类和父类的关系,而我们之前也说过Integer类的父类是Number类,那么如果我们将方法中的泛型定义为Number,作为子类的Integer能否作为参数传入方法showFlag呢?答案是不能,这样定义时如果实例化泛型类时泛型为Number,那么实例化的对象能够传入showFlag方法,但是作为子类的Integer仍然不能作为参数传入该方法,这是因为泛型只是作为占位符在类和方法中扮演类型的身份,它没有识别子类和父类关系的功能,就像下面的图片展示的一样,当我们修改方法中的泛型为Number后,Number的子类Integer和String类的地位是一样的,都无法作为正确的参数传入方法showFlag。 

 

        那么这是否意味着对于同一个方法如果要传入不同类型的参数时我都要修改方法中作为参数传入的泛型呢?这就是通配符存在的意义,我们在定义泛型方法的时候并不能确定在调用该方法时传入的参数是什么类型,而在调用方法的时候又回去修改方法中要传入的泛型的话方法作为java中的封装体显然就失去了它的作用,这时就可以采用通配符来代表泛型。通配符在没有规定界限的时候能够表示所有的泛型,就像在以下的演示代码中,我们在方法showFlag中定义传入的对象类型为通配符,这时在调用方法时,无论对象是什么类型,都可以作为参数正常传入。

        不过这样做也存在一些问题,那么就是如果什么样的了类型都可以传入方法那么这个方法就失去了针对性,比如我们定义了一个方法来对学类的年龄来进行处理,这时即使我们传入一个另一个类比如猫,方法也不会报错,且能正常运行,这和我们的初衷相违背,因此我们还需要对通配符进行限定。

        在java中通配符的上限用extends 类型1来表示,它代表通配符?所代表的类型最高只能是类型1或者类型1的子类,如果输入了类型1的父类,那么代码报错。统配符的下限用 super 类型表示,它代表通配符? 所代表的类型只能是类型2或者类型2的父类,如果传入了类型2的子类,那么代码报错。在通配符的范围限定中要注意虽然只是替换了关键词,但是它们二者之间仍然存在区别——通配符的上限限定ectends可以适用到所用泛型中,在定义泛型时可以用同样的语法结构规定它的上限,但是通配符的下限限定super只能用于通配符,无法应用到其他泛型符号中去。

package com.generic.demo;/*** 泛型类*/
public class Generic<T> {private T flag;public T getFlag() {return flag;}public void setFlag(T flag) {this.flag = flag;}
}
package com.generic.demo;public class ShowMsg {public void showFlag(Generic<? /*super Number*/  /*extends Number*/> generic){//通配符的下限限定不适用于泛型类System.out.println(generic.getFlag());}
}
package com.generic.demo;public class TestShowMsg {public static void main(String[] args) {ShowMsg showMsg = new ShowMsg();Generic<Integer> generic = new Generic<>();generic.setFlag(20);showMsg.showFlag(generic);System.out.println("_________________");Generic<Number> generic1 = new Generic<>();generic1.setFlag(50);showMsg.showFlag(generic1);System.out.println("________________________");Generic<String> generic2 = new Generic<>();generic2.setFlag("30");showMsg.showFlag(generic2);}
}

 

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

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

相关文章

优化大型语言模型交互:提升查询和提示效果的26条原则

推荐下arxiv挂的一个提示词教程&#xff1a; https://github.com/VILA-Lab/ATLAS https://arxiv.org/abs/2312.16171 它提出了一套26条指导原则&#xff0c;改善和优化与大型语言模型&#xff08;LLMs&#xff09;的交互过程。通过这些原则&#xff0c;旨在简化对LLMs的查询和…

E4980A是德科技E4980A精密LCR表

181/2461/8938产品概述&#xff1a; Keysight E4980A 精密 LCR 表为各种元件测量提供了精度、速度和多功能性的最佳组合。E4980A 在低阻抗和高阻抗范围内提供快速测量速度和出色的性能&#xff0c;是元件和材料的一般研发和制造测试的终极工具。LAN、USB 和 GPIB PC 连接可提高…

【氮化镓】p-GaN HEMTs空穴陷阱低温冻结效应

这篇文章是关于低温条件下p-GaN高电子迁移率晶体管&#xff08;HEMTs&#xff09;栅极漏电的研究。文章通过电容深能级瞬态谱&#xff08;C-DLTS&#xff09;测试和理论模型分析&#xff0c;探讨了空穴陷阱对栅极漏电电流的影响。以下是对文章的总结&#xff1a; 摘要&#xf…

本地认证的密码去哪了?怎么保证安全的?

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff1f;密文存在哪个文件下?该文件是否可以打开&#xff0c;并且查看到密文&#xff1f; 系统将输入的明文密码通过hash算法转为哈希值&#xff0c;且输入的值会在内存中立即删除无法查看。 然后将密文存放在C:…

基于Spring Boot的火车订票管理系统设计与实现

基于Spring Boot的火车订票管理系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页功能界面图&#xff0c;在系统首页可以查看…

ROS机器人小车建模仿真与SLAM(5)

目录 一、ROS中使用摄像头 1.1 验证摄像头设备可用 1.2 安装cheese 1.3 测试 二、获取摄像头驱动包 2.1 usb_cam 2.1.1 rosrun方式运行 2.1.2 roslaunch方式运行 三、摄像头标定(camera calibration) 3.2 标定前准备 3.2.1 标定板 3.2.2 摄像头调焦 3.3 标定摄像头…

MySQL__索引

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; MySQL__索引&#xff09; ⏱️ 创作时间&#xff1a;2024年04月23日 ———————————————— 这里写目…

avl excite python二次开发1--python解释器需用内置解释器aws_cmd

avl excite python二次开发1--python解释器需用内置解释器aws_cmd 1、python解释器问题1.1、用外置python解释器&#xff0c;import WSInterface会失败(WSInterface.pyd)1.2、用内置解释器aws_cmd运行py脚本1.3 用内置解释器aws_python执行脚本三级目录 1、python解释器问题 1…

Python_AI库 Pandas的数据结构及基本操作

Python_AI库 Pandas的数据结构及基本操作 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 本文篇幅较长&#xff0c;但比较重要&#xff0c;希望读者可以认真看完并实例运行。 Pa…

Hugging Face 新开源Parler-TTS,高质量文本转语音模型,可自主训练定制声音,训练代码、模型、数据集全部公开

前言 Parler-TTS 是大名鼎鼎的huggingface推出的一款轻量级文本到语音&#xff08;TTS&#xff09;模型&#xff0c;它能够生成高质量、自然流畅的语音&#xff0c;并且能够模仿特定说话者的风格&#xff0c;包括性别、音高、说话风格等。这款模型是由Dan Lyth和Simon King创建…

【机器学习原理】决策树从原理到实践

基于树的模型是机器学习中非常重要的一类模型&#xff0c;最基础的就是决策树&#xff0c;本篇主要讲述决策树的原理和几类最常见的决策树算法&#xff0c;这也是更复杂的树模型算法的基础。 参考文章&#xff1a; 1.CSDN-基于熵的两个模型(ID3,C4.5)比较详细&#xff0c;有数字…

PotatoPie 4.0 实验教程(22) —— FPGA实现摄像头图像对数(log)变换

什么是图像的log变换&#xff1f; 总的来说&#xff0c;对数变换是一种常用的图像增强技术&#xff0c;可以改善图像的视觉质量、减少噪声以及突出图像中的细节&#xff0c;从而提高图像在视觉感知和分析中的效果和可用性。 图像的对数变换&#xff08;log transformation&am…

【Linux命令行艺术】1. 初见命令行

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

Anti Rookit -- 检测隐藏进程

Anti Rookit 一&#xff1a;检测隐藏进程 引言 检测隐藏进程除了众所周知的枚举进程ID之外&#xff0c;还有枚举句柄表的方式。不过今天给大家带来的是第三种方法。 探究 应用层通过接口 C r e a t e P r o c e s s \textcolor{cornflowerblue}{CreateProcess} CreateProcess…

【Linux系统编程】26.信号、kill、alarm、setitimer

目录 信号 信号共性 信号特质 产生信号 信号相关概念 默认处理动作 信号4要素 常规信号 ​编辑 注意 kill 参数pid 测试代码1 测试结果 测试代码2 测试结果 alarm 参数seconds 返回值 取消闹钟 测试代码3 测试结果1 测试结果2 ​编辑 setitimer 参数…

BIO、NIO与AIO

一 BIO 同步并阻塞(传统阻塞型)&#xff0c;服务器实现模式为一个连接一个线程&#xff0c;即客户端有连接请求时服务器端就需要启动一个线程进行处理. BIO&#xff08;Blocking I/O&#xff0c;阻塞I/O&#xff09;模式是一种网络编程中的I/O处理模式。在BIO模式中&#xf…

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽&#xff0c;大致可以分为两大类&#x…

网络攻击日益猖獗,安全防护刻不容缓

“正在排队登录”、“账号登录异常”、“断线重连”......伴随着社交软件用户的一声声抱怨&#xff0c;某知名社交软件的服务器在更新上线2小时后&#xff0c;遭遇DDoS攻击&#xff0c;导致用户无法正常登录。在紧急维护几小时后&#xff0c;这款软件才恢复正常登录的情况。 这…

有哪些好用电脑端时间定时软件?桌面日程安排软件推荐 桌面备忘录

随着现代生活节奏的加快&#xff0c;人们对于时间管理和任务提醒的需求越来越大。为了满足这一需求&#xff0c;市场上涌现出了众多桌面便签备忘录软件&#xff0c;它们不仅可以帮助我们记录待办事项&#xff0c;还能定时提醒我们完成任务。在这篇文章中&#xff0c;我将为大家…

WebGIS面试题(第六期)-GeoServer

WebGIS面试题&#xff08;第六期&#xff09; 以下题目仅为部分题目&#xff0c;全部题目在公众号 {GISer世界} &#xff0c;答案仅供参考!!! 因为本人之前做过相关项目用到了GeoServer&#xff0c;因此在简历上写了熟悉GeoServer。所以在相关面试中都有问到&#xff0c;所以我…