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);
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle集群-常用查询及操作(工作日常整理)

1.Oracle集群状态 select * from gv$instance; 示例结果&#xff1a; 2.Oracle集群-增大表空间 常见问题&#xff1a; 导入时或使用时&#xff0c;提示无法extend table ,增加表空间即可 常用操作&#xff1a; 1&#xff09;查询表空间 select * from dba_tablespaces; --…

微信小程序[黑马笔记]

简介 常用组件 视图组件 <!--pages/list/list.wxml--><scroll-view class"container1" scroll-y><view>A</view><view>B</view><view>A</view></scroll-view><!--pages/list2/list.wxml--><swiper …

【禅道客户案例】同方智慧能源数智化转型新实践 禅道助力前行

同方智慧能源是同方股份有限公司的骨干企业。依托中核集团、清华大学的科技优势&#xff0c;坚持技术和资源双核驱动&#xff0c;基于30多年行业积淀&#xff0c;面向建筑、交通、工业、北方供热、数据中心等主要用能场景提供设计咨询、产品技术、投资建设、运营服务&#xff0…

设计模式学习笔记 - 项目实战一:设计实现一个支持各种算法的限流框架(实现)

概述 上篇文章&#xff0c;我们介绍了如何通过合理的设计&#xff0c;来实现框架的功能性需求的同时&#xff0c;满足易用、易扩展、灵活、低延迟、高容错等非功能性需求。在设计的过程中&#xff0c;我们也借鉴了之前讲过的一些开源项目的设计思想。比如 Spring 的低侵入松耦…

细致讲解——不同类型LSA是作用以及相互之间的联系

目录 一.常见的LSA类型 二.OSPF特殊区域 1.区域类型 2.stub区域和totally stub区域 &#xff08;1&#xff09;stub区域 &#xff08;2&#xff09;totally stub区域 3.nssa区域和totally nssa区域 &#xff08;1&#xff09;nssa区域 &#xff08;2&#xff09;totall…

【Android】SharedPreferences阻塞问题深度分析

前言 Android中SharedPreferences已经广为诟病&#xff0c;它虽然是Android SDK中自带的数据存储API&#xff0c;但是因为存在设计上的缺陷&#xff0c;在处理大量数据时很容易导致UI线程阻塞或者ANR&#xff0c;Android官方最终在Jetpack库中提供了DataStore解决方案&#xf…

微信小程序使用echarts实现条形统计图功能

微信小程序使用echarts组件实现条形统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;其实很简单&#xff0c;只需要简单的两步就可以实现啦&#xff0c;具体思路如下&#xff1a; 引入echarts组件调用相应的函数方法 由于需要引入echarts组件&#xff0c;代…

.net报错异常及常用功能处理总结(持续更新)

.net报错异常及常用功能处理总结---持续更新 1. WebApi dynamic传参解析结果中ValueKind Object处理方法问题描述方案1&#xff1a;(推荐&#xff0c;改动很小)方案2&#xff1a; 2.C# .net多层循环嵌套结构数据对象如何写对象动态属性赋值问题描述JavaScript动态属性赋值.net…

WebSocket通信协议

WebSocket是一种网络通信协议.RFC6455定义了它的通信标准 WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双向通信的协议 HTTP协议是一种无状态的,无连接的,单向的应用层协议.它采用了请求,响应的模式.通信请求只能由客户端发起,服务端对请求做出应答处理. 这种模型有…

PO框架【自动化测试】

对象&#xff1a;Tpshop商城 需求&#xff1a;更换头像 操作步骤&#xff1a; 个人信息–头像–上传图片–图片确认–确认保存 核心代码&#xff1a; # 进入frame框架[不熟] driver.switch_to.frame(driver.find_element_by_xpath(//*[id"layui-layer-iframe1"]))…

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

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

为什么要学音视频?

一直都在说“科技改变生活”&#xff0c;现实告诉我们这是真的。 随着通信技术和 5G 技术的不断发展和普及&#xff0c;不仅拉近了人与人之间的距离&#xff0c;还拉近了人与物&#xff0c;物与物之间的距离&#xff0c;万物互联也变得触手可及。 基于此背景下&#xff0c;音…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类&#xff0c;C是一种结构化语言&#xff0c;它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程&#xff0c;对输入进行运算处理得到输出&#xff0c;而对C&#xff0c;首先要考虑的是如何构造一个对象&#xff0c;通…

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统&#xff0c;支持各种编程语言和工具。 Jenkins是一款开…

PotatoPie 4.0 实验教程(27) —— FPGA实现摄像头图像拉普拉斯边缘提取

拉普拉斯边缘提取有什么作用&#xff1f; 拉普拉斯边缘检测是一种常用的图像处理技术&#xff0c;用于检测图像中的边缘和边界。它的主要作用包括&#xff1a; 边缘检测&#xff1a;拉普拉斯算子可以帮助检测图像中的边缘&#xff0c;即图像中亮度快速变化的位置。这些边缘通常…

前端HTML5学习2(新增多媒体标签,H5的兼容性处理)

前端HTML5学习2新增多媒体标签&#xff0c;H5的兼容性处理&#xff09; 分清标签和属性新增多媒体标签新增视频标签新增音频标签新增全局属性 H5的兼容性处理 分清标签和属性 标签&#xff08;HTML元素&#xff09;和属性&#xff0c;标签定义了内容的类型或结构&#xff0c;而…

RocketMQ 消息重复消费

现象 触发消息后&#xff0c;在1s内收到了两次消息消费的日志。 消息消费日志重复&#xff0c;reconsumeTimes0&#xff0c;主机实例也不同&#xff0c;说明是同一条消息被消费了两次 分析 生产者发送消息的时候使用了重试机制&#xff0c;发送消息后由于网络原因没有收到MQ…

永磁同步电机PMSM负载状态估计simulink模型

永磁同步电机PMSM负载状态估计simulink模型&#xff0c;龙伯格观测器&#xff0c;各种卡尔曼滤波器&#xff0c;矢量控制&#xff0c;坐标变换&#xff0c;永磁同步电机负载转矩估计&#xff0c;pmsm负载转矩测量&#xff0c;负载预测&#xff0c;转矩预测的matlab/simulink仿真…

【C++】---STL容器适配器之queue

【C】---STL容器适配器之queue 一、队列1、队列的性质 二、队列类1、队列的构造2、empty()3、push()4、pop()5、size()6、front()7、back() 三、队列的模拟实现1、头文件&#xff08;底层&#xff1a;deque&#xff09;2、测试文件3、底层&#xff1a;list 一、队列 1、队列的…