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

了解java中的通配符“?“

目录

通配符的作用

        先看一段代码

        用通配符"?"后,代码变化

        结论

通配符上界 

通配符下界

对通配符上下界的注释理解及其练习代码  


简记: ?  用于在泛型的使用,即为通配符.
在Java中,通配符(wildcard)主要用于泛型编程,用于表示一个不确定的类型。
通配符有三种形式:1.通配符<?>  2.通配符<? extends T>   3. 通配符<? super T>

通配符的作用

先看一段代码

class Test0 {public static void main(String[] args) {System.out.println("===========1.String==============");Message<String> message1 = new Message<>();message1.setMessage("fly in the sky!");fun1(message1);System.out.println("===========2.Integer=============");Message<Integer> message2 = new Message<>();message2.setMessage(99);fun2(message2);System.out.println("===========3.Character============");Message<Character> message3 = new Message<>();message3.setMessage('s');func3(message3);System.out.println("===========4.Short================");Message<Short> message4 = new Message<>();message4.setMessage((short) 213);func4(message4);System.out.println("===========5.Long=================");Message<Long> message5 = new Message<>();message5.setMessage(1024L);func5(message5);System.out.println("===========6.Float=================");Message<Float> message6 = new Message<>();message6.setMessage(3.1415926f);func6(message6);System.out.println("===========7.Double================");Message<Double> message7 = new Message<>();message7.setMessage(1024.0213);func7(message7);System.out.println("===========8.Boolean===============");Message<Boolean> message8 = new Message<>();message8.setMessage(true);func8(message8);}public static void fun1(Message<String> tmp) {System.out.println(tmp.getMessage());}public static void fun2(Message<Integer> tmp) {System.out.println(tmp.getMessage());}public static void func3(Message<Character> tmp) {System.out.println(tmp.getMessage());}public static void func4(Message<Short> tmp) {System.out.println(tmp.getMessage());}public static void func5(Message<Long> tmp) {System.out.println(tmp.getMessage());}public static void func6(Message<Float> tmp) {System.out.println(tmp.getMessage());}public static void func7(Message<Double> tmp) {System.out.println(tmp.getMessage());}public static void func8(Message<Boolean> tmp) {System.out.println(tmp.getMessage());}
}

用通配符"?"后,代码变化

class Test1 {public static void func(Message<?> temp) {System.out.println(temp.getMessage());}public static void main(String[] args) {System.out.println("===========1.String==============");Message<String> message1 = new Message<>();message1.setMessage("fly in the sky!");func(message1);System.out.println("===========2.Integer=============");Message<Integer> message2 = new Message<>();message2.setMessage(99);func(message2);System.out.println("===========3.Character============");Message<Character> message3 = new Message<>();message3.setMessage('s');func(message3);System.out.println("===========4.Short================");Message<Short> message4 = new Message<>();message4.setMessage((short) 213);func(message4);System.out.println("===========5.Long=================");Message<Long> message5 = new Message<>();message5.setMessage(1024L);func(message5);System.out.println("===========6.Float=================");Message<Float> message6 = new Message<>();message6.setMessage(3.1415926f);func(message6);System.out.println("===========7.Double================");Message<Double> message7 = new Message<>();message7.setMessage(1024.0213);func(message7);System.out.println("===========8.Boolean===============");Message<Boolean> message8 = new Message<>();message8.setMessage(true);func(message8);}
}

结论

结论:使用通配符"?"可以接收所有的泛型类型,从而大大减少代码量,


 注:虽然通配符 "?" 可以接受任意类型,但正因为如此,由于不确定类型,所以在func方法中无法修改操作


在"?"的基础上又产生了两个子通配符: 
? extends 类:设置通配符上限 =>  通配符上界
? super 类:设置通配符下限 =>  通配符下界

通配符上界 

通配符上界
语法:
<? extends 上界>
<? extends String>
//可以传入的实参类型是String或者String的子类

通配符的上界,不能进行写入数据,只能进行读取数据

 通配符下界

通配符下界                                                                                                             
语法:
<? super 下界>                            
<? super  Integer>//代表 可以传入的实参的类型是 Integer或者 Integer的父类类型 

通配符的下界,不能进行读取数据,只能写入数据

class Food {
}class Fruit extends Food {
}class Apple extends Fruit {
}class Banana extends Fruit {
}

对通配符上下界的注释理解及其练习代码  

class Food {}
class Fruit extends Food {}
class Apple extends Fruit {}
class Banana extends Fruit {}
class Plate<T> {//设置泛型private T message;public T getMessage() {return message;}public void setMessage(T message) {this.message = message;}
}
public class Test2 {public static void main1(String[] args) {Plate<Apple> applePlate = new Plate<>();applePlate.setMessage(new Apple());func1(applePlate);Plate<Banana> bananaPlate = new Plate<>();bananaPlate.setMessage(new Banana());func1(bananaPlate);}//通配符的上界//通配符的上界,不能进行写入数据,只能进行读取数据public static void func1(Plate<? extends Fruit> tmp) {//这里仍然不可以进行修改!tmp接收的是Fruit和他的子类,此时存储的元素应该是哪个子类无法确定。System.out.println(tmp.getMessage());Fruit b = tmp.getMessage();//向上转型System.out.println(b);}//通配符的下界//通配符的下界,不能进行读取数据,只能写入数据public static void main(String[] args) {Plate<Fruit> fruitPlate = new Plate<>();fruitPlate.setMessage(new Fruit());func2(fruitPlate);Plate<Food> foodPlate = new Plate<>();foodPlate.setMessage(new Food());func2(foodPlate);}public static void func2(Plate<? super Fruit> tmp) {//传入参数为Fruit及其父类 ,//此时可以修改!!添加的是Fruit 或者Fruit的子类tmp.setMessage(new Apple());tmp.setMessage(new Fruit());//不能接收,这里无法确定是哪个父类,父类太多了}
}

  
 

相关文章:

了解java中的通配符“?“

目录 通配符的作用 先看一段代码 用通配符"?"后,代码变化 结论 通配符上界 通配符下界 对通配符上下界的注释理解及其练习代码 简记: ? 用于在泛型的使用&#xff0c;即为通配符. 在Java中&#xff0c;通配符&#xff08;wildcard&#xff09;主要用于泛型…...

浙大陈越何钦铭数据结构07-图6 旅游规划【最小堆实现】

题目&#xff1a; 题目和浙大陈越何钦铭数据结构07-图6 旅游规划是一样的&#xff0c;不同的是用最小堆实现函数【FindMinDist】。 时间复杂度对比&#xff1a; 浙大陈越何钦铭数据结构07-图6 旅游规划&#xff1a; 创建图&#xff08;CreateGraph&#xff09;&#xff1a;时…...

OpenShift 4 - 用 Prometheus 和 Grafana 监视用户应用定制的观测指标(视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.13 的环境中验证 文章目录 OpenShift 的监控功能构成部署被监控应用用 OpenShift 内置功能监控应用用 Grafana 监控应用安装 Grafana 运行环境配置 Grafana 数据源定制监控 Dashboard 演示视…...

【LeetCode】剑指 Offer <二刷>(3)

目录 题目&#xff1a;剑指 Offer 06. 从尾到头打印链表 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 07. 重建二叉树 - 力扣&#xf…...

Ceph IO流程及数据分布

1. Ceph IO流程及数据分布 1.1 正常IO流程图 步骤&#xff1a; client 创建cluster handler。client 读取配置文件。client 连接上monitor&#xff0c;获取集群map信息。client 读写io 根据crshmap 算法请求对应的主osd数据节点。主osd数据节点同时写入另外两个副本节点数据。…...

Netty-NIO

文章目录 一、NIO-Selector1.处理accept2.cancel3.处理read4.处理客户端断开5. 处理消息的边界6. 写入内容过多的问题7. 处理可写事件 一、NIO-Selector 1.处理accept //1.创建selector,管理多个channel Selector selector Selector.open(); ByteBuffer buffer ByteBuffer.…...

红外物理学习笔记 ——第三章

第三章 基尔霍夫定律&#xff1a;就是说物体热平衡条件下&#xff0c;发射的辐射功率要等于吸收的辐射功率 M α E M\alpha E MαE α \alpha α 是吸收率&#xff0c; M M M 是幅出度&#xff08;发射出去的&#xff09;&#xff0c; E E E是辐照度&#xff08;外面照过来的…...

使用 htmx 构建交互式 Web 应用

学习目标&#xff1a;了解htmx的基本概念、特点和用法&#xff0c;并能够运用htmx来创建交互式的Web应用程序。 学习内容&#xff1a; 1. 什么是htmx&#xff1f; - htmx是一种用于构建交互式Web应用程序的JavaScript库。 - 它通过将HTML扩展为一种声明性的交互式语言&a…...

S32K324芯片学习笔记

文章目录 Core and architectureDMASystem and power managementMemory and memory interfacesClocksSecurity and integrity安全与完整性Safety ISO26262Analog、Timers功能框图内存mapflash Signal MultiplexingPort和MSCR寄存器的mapping Core and architecture 两个Arm Co…...

htmx-使HTML更强大

‍本文作者是360奇舞团开发工程师 htmx 让我们先来看一段俳句: javascript fatigue: longing for a hypertext already in hand 这个俳句很有意思&#xff0c;是开源项目htmx文档中写的&#xff0c;意思是说&#xff0c;我们已经有了超文本&#xff0c;为什么还要去使用javascr…...

Java学习之序列化

1、引言 《手册》第 9 页 “OOP 规约” 部分有一段关于序列化的约定 1&#xff1a; 【强制】当序列化类新增属性时&#xff0c;请不要修改 serialVersionUID 字段&#xff0c;以避免反序列失败&#xff1b;如果完全不兼容升级&#xff0c;避免反序列化混乱&#xff0c;那么请…...

C++实现蜂群涌现效果(flocking)

Flocking算法0704_元宇宙中的程序员的博客-CSDN博客 每个个体的位置&#xff0c;通过计算与周围个体的速度、角度、位置&#xff0c;去更新位置。...

IDEA复制一个工程为多个并启动,测试负载均衡

1 找到服务按钮 2 选择复制配置 3 更改新的名称与虚拟机参数 复制下面的代码在VM参数中 -Dserver.port8082 4 最后启动即可...

001_C++语法基础

C语法基础 所有C语法要用英文区分大小写每个语句写完以分号结束 C标准输入输出头文件iostream 若想通过C实现数据的输入和输出&#xff0c;需要导入标准输入输出头文件 #include <iostream>标准输入输出头文件<iostream>中包含了cin输入语句和cout输出语句 标…...

对Excel表中归类的文件夹进行自动分类

首先把excel表另存为.txt文件&#xff08;注意&#xff1a;刚开始可能是ANSI格式&#xff0c;需要转成UTF-8格式&#xff09;&#xff1b;再新建一个.txt文件&#xff0c;重命名成.bat文件(注意&#xff1a;直接创建的如果是是UTF-8格式&#xff0c;最好转成ANSI格式&#xff0…...

LabVIEW液压支架控制系统的使用与各种配置的预测模型的比较分析

LabVIEW液压支架控制系统的使用与各种配置的预测模型的比较分析 模型预测控制在工业中应用广泛。这种方法的优点之一是在求解最优控制问题时能够明确考虑对输入和输出状态施加的约束。控制对象模型用于有限时间范围内最优控制的实时计算。所使用的数学设备允许从具有单输入和单…...

C++中位运算符使用

& 与 只有都为1结果为1 0 & 0 00 & 1 01 & 0 01 & 1 1 | 或 只要一个为1结果为1 0|00 0|11 1|01 1|11 ^ 异或 两个相同的数字为0&#xff0c;其余为1 0^00 1^01 0^11 1^10 ~ 取反 将进制位数进行取反 ~1-2 //0000 0001-->代…...

微机原理 || 第2次测试:汇编指令(加减乘除运算,XOR,PUSH,POP,寻址方式,物理地址公式,状态标志位)(测试题+手写解析)

&#xff08;一&#xff09;测试题目&#xff1a; 1.数[X]补1111,1110B&#xff0c;则其真值为 2.在I/O指令中,可用于表示端口地址的寄存器 3. MOV AX,[BXSl]的指令中&#xff0c;源操作数的物理地址应该如何计算 4.执行以下两条指令后&#xff0c;标志寄存器FLAGS的六个状态…...

人员闯入检测告警算法

人员闯入检测告警算法通过yolov5网络模型识别检测算法&#xff0c;人员闯入检测告警算法对未经许可或非法进入的人员进行及时识别告警&#xff0c;确保对危险区域的安全管理和保护。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位…...

python中super()用法

super关键字的用法 一、概述二、作用三、语法四、使用示例1.通过super() 来调用父类的__init__ 构造方法&#xff1a;2.通过supper() 来调用与子类同名的父类方法2.1 单继承2.2 多继承 一、概述 super() 是python 中调用父类&#xff08;超类&#xff09;的一种方法&#xff0…...

Qwen3.5-35B-A3B-AWQ-4bit镜像免配置优势:无Python依赖冲突,纯净运行环境

Qwen3.5-35B-A3B-AWQ-4bit镜像免配置优势&#xff1a;无Python依赖冲突&#xff0c;纯净运行环境 1. 镜像核心优势 Qwen3.5-35B-A3B-AWQ-4bit镜像最突出的特点是其开箱即用的纯净环境。与传统AI部署方案相比&#xff0c;这个镜像解决了开发者最头疼的Python依赖冲突问题。通过…...

普冉PY32F071内存紧张?FreeRTOS配置优化全攻略(含heap_4选择与任务栈设置)

普冉PY32F071内存紧张&#xff1f;FreeRTOS配置优化全攻略&#xff08;含heap_4选择与任务栈设置&#xff09; 当你在PY32F071这颗Cortex-M0芯片上运行FreeRTOS时&#xff0c;是否遇到过任务莫名崩溃、系统运行不稳定的情况&#xff1f;作为一款仅有20KB RAM的微控制器&#xf…...

别再只升级OpenSSH了!一次搞懂Linux离线环境下的依赖包管理与编译安装避坑指南

离线环境下的Linux软件编译&#xff1a;从OpenSSH升级到通用依赖管理方法论 当你面对一台无法连接互联网的Linux服务器时&#xff0c;软件升级和安装往往会变成一场噩梦。想象一下&#xff1a;你下载了最新版OpenSSH的源码包&#xff0c;满怀希望地执行./configure&#xff0c;…...

STM32主从定时器实战:用CubeMX搞定PWM移相+动态调占空比(附G474配置)

STM32主从定时器实战&#xff1a;CubeMX图形化配置PWM移相与动态调占空比 在电力电子和电机控制领域&#xff0c;精确的PWM信号控制是系统高效运行的关键。对于需要多路相位可调PWM的应用场景&#xff0c;如交错并联DC/DC变换器、三相逆变器等&#xff0c;传统的手动寄存器配置…...

AI开发不再卡顿:RTX4090D 24G镜像解决环境冲突全攻略

AI开发不再卡顿&#xff1a;RTX4090D 24G镜像解决环境冲突全攻略 1. 为什么选择RTX4090D 24G深度学习镜像&#xff1f; 深度学习开发者最头疼的问题莫过于环境配置。不同框架版本、CUDA版本、依赖库之间的冲突常常让人望而却步。传统环境搭建方式需要&#xff1a; 手动安装C…...

如何用Penpot构建完整的用户体验地图和用户旅程:7步打造完美设计流程

如何用Penpot构建完整的用户体验地图和用户旅程&#xff1a;7步打造完美设计流程 【免费下载链接】penpot Penpot - The Open-Source design & prototyping platform 项目地址: https://gitcode.com/GitHub_Trending/pe/penpot Penpot作为开源的设计与原型平台&…...

开源像素艺术生成工具上手指南:像素幻梦2.0-Stable镜像免配置部署

开源像素艺术生成工具上手指南&#xff1a;像素幻梦2.0-Stable镜像免配置部署 1. 像素幻梦简介 像素幻梦(Pixel Dream Workshop)是一款基于FLUX.1-dev扩散模型构建的下一代像素艺术生成工具。它采用16-bit像素工坊风格的视觉设计&#xff0c;为创作者提供沉浸式的AI绘图体验。…...

Python自动化办公:3种PDF水印处理技巧(附完整代码)

Python自动化办公&#xff1a;3种PDF水印处理技巧&#xff08;附完整代码&#xff09; 在数字化办公场景中&#xff0c;PDF文档的水印处理已成为高频需求。无论是合同归档需要添加版权标识&#xff0c;还是内部文件流转需清除敏感标记&#xff0c;传统手动操作既耗时又易出错。…...

AI辅助开发:用提示词让快马AI自动生成技术职级成长路径分析应用

AI辅助开发&#xff1a;用提示词让快马AI自动生成技术职级成长路径分析应用 最近在研究技术职级体系时&#xff0c;发现很多开发者对阿里P10这类高级职位的成长路径特别感兴趣。但手动整理这些信息费时费力&#xff0c;于是尝试用AI辅助开发的方式快速生成一个可视化分析工具。…...

4个强大的开源工具功能扩展方案

4个强大的开源工具功能扩展方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial request limit. / Too many fre…...