泛型进阶:通配符

基本概念 

对泛型不了解的可以看这篇博客:数据结构前瞻-CSDN博客

一般来说,?在泛型里的使用就是通配符

看看下面的代码

class Message<T> {private T message ;public T getMessage() {return message;}public void setMessage(T message) {this.message = message;}
}
public class Test {public static void main(String[] args) {Message<String> message = new Message<>() ;message.setMessage("比特就业课欢迎您");fun(message);}public static void fun(Message<String> temp){System.out.println(temp.getMessage());}
}

现在我们想让程序打印另一条消息,类型是Integer,这么一搞直接报错了

因为我们的fun函数已经限定传入的必须是String类型,那我们要打印Integer怎么办呢?

把String换成?表示程序也不知道要打印哪种类型,那不就可以打印所有类型了吗

但是这样做就不能在fun里面setMessage了,因为传入的temp也不知道是什么类型


通配符上界

语法

<? extends 上界>
<? extends Number>//可以传入的实参类型是Number或者Number的子类

例子

定义盘子泛型,可以放入Apple和Banana等水果

class Plate<T> { // 设置泛型private T message ;public T getMessage() {return message;}public void setMessage(T message) {this.message = message;}}

 定义通配符上界

    public static void fun(Plate<? extends Fruit> temp){Fruit fruit = temp.getMessage();//向上转型System.out.println(fruit);}
    public static void main(String[] args) {Plate<Apple> plate = new Plate<>();Plate<Banana> plate1 = new Plate<>();fun(plate);fun(plate1);}

通配符下界

<? super 下界>
<? super Integer>//代表 可以传入的实参的类型是Integer或者Integer的父类类型

 

为什么这里会报错呢?

因为temp.getMessage()拿到的是Fruit的父类Food,跟前面的Fruit类型不匹配?

不匹配就强制让它匹配,强转一下就可以运行了

Fruit fruit = (Fruit) temp.getMessage();

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

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

相关文章

go类型断言类型转换

类型断言 断言 在现代化 程序中 有助于 终止代码 , 防止 更大的 错误产生 package mainimport "fmt"func main() {var i interface{} "hello"s : i.(string)fmt.Println(s)s, ok : i.(string)fmt.Println(s, ok)f, ok : i.(float64)fmt.Println(f, ok)f…

网络协议头分析及抓包三次挥手四次握手

数据的封装与传递过程 思考&#xff1a; 应用层调用send后&#xff0c;是如何把数据发送到另一台机器的某个进程的。接收的设备收到数据包后&#xff0c;如何处理给应用层&#xff1f; MTU &#xff1a; Maximum Transmit Unit 最大传输单元 物理接口&#xff08;数据链路层&am…

android的通知使用

在 Android 中&#xff0c;通知&#xff08;Notification&#xff09;是一种在状态栏显示消息的方式&#xff0c;通常用于向用户展示应用程序的重要信息、事件或更新。以下是一个简单的示例&#xff0c;演示如何在 Android 应用程序中使用通知&#xff1a; import android.app…

Lightsail VPS 实例在哪些方面胜过 EC2 实例?

文章作者&#xff1a;Libai 引言 Lightsail VPS 实例和 EC2 实例是云计算领域中两种受欢迎的技术。虽然两者都提供虚拟服务器解决方案&#xff0c;但了解 Lightsail VPS 实例在哪些方面胜过 EC2 实例非常重要。在本文中&#xff0c;我们将探讨这两种技术之间的关键区别&#x…

如何调用本地 json 文件数据

文章目录 如何调用本地 json 文件数据1. 使用场景2. 步骤 如何调用本地 json 文件数据 1. 使用场景 使用场景&#xff1a;当无数据接口时&#xff0c;需要调用自己写的 json 文件&#xff0c;请求数据。 2. 步骤 在 public 文件夹下&#xff0c;新建一个存放 json 数据的文件…

CI/CD - jenkins

目录 一、部署 1、简介 2、部署 二、配置 三、实时触发 四、自动化构建docker镜像 五、通过ssh插件交付任务 六、添加jenkins节点 七、RBAC 八、pipeline 九、jenkins结合ansible参数化构建 1、安装ansible 2、新建gitlab项目 3、jenkins新建项目playbook 一、部…

choices参数的使用、MVC和MTV的模式、创建表对表关系的三种创建方式

【1】choices参数的使用 应用场景&#xff1a;针对表中可能列表完全的字段&#xff0c;采用choices参数 例如&#xff1a;性别&#xff0c;代码如下 # 1.创建一张表class gender_info(models.Model):name models.CharField(max_length32)password models.CharField(max_lengt…

大数据题目的解题技巧

目录 大数据题目的技巧总括 实例精析 实例一 实例二 实例三 大数据题目的技巧总括 &#xff08;1&#xff09;哈希函数可以把数据按照种类均匀分流&#xff1b; &#xff08;2&#xff09;布隆过滤器用于集合的建立与查询&#xff0c;并可以节省大量空间&#xff1b; &…

ubuntu 安装 gparted

前提环境&#xff1a; 阿里云的源。 sudo apt update sudo apt upgrade sudo apt install gparted 搜索&#xff1a;

Android AIDL中使用Surface问题

1.构建ITest.aidl文件 package com.xxx.xxxx;import android.view.Surface;interface IMonitorService {boolean addSurface(in Surface surface);boolean removeSurface(in Surface surface); } 2.构建时报错 3.Surface源码分析 android.view.Surface中包含两个Surface类&am…

Spring Boot和Spring MVC的区别

1 Spring MVC 是Spring的一个模块&#xff0c;是一个web框架。分为Model&#xff0c;View&#xff0c;Controller&#xff08;模型层、视图层、控制层&#xff09;。 2 Spring Boot Spring Boot 自动配置&#xff0c;降低了项目搭建的复杂度。Spring框架需要大量的配置&…

查看windows后台进程命令行参数

wmic process where processid[PID] get commandline管理员身份运行cmd&#xff0c;输入以上命令&#xff0c;[PID]替换为任务管理器中看到的PID

万字解析设计模式之 装饰者模式

一、装饰者模式 1.1概述 装饰者模式是一种结构型设计模式&#xff0c;它允许在运行时动态地为一个对象添加额外的职责。它以一种透明的方式来扩展对象的功能&#xff0c;而不需要通过子类来实现。在装饰者模式中&#xff0c;有一个基本对象&#xff0c;也称为组件&#xff0c;…

SpringBean的配置详解 --中

目录 Bean的初始化和销毁方法配置 Bean的初始化和销毁方法配置 扩展 Bean的实例化 Bean的初始化和销毁方法配置 当lazy-init设置为true时为延迟加载&#xff0c;也就是当Spring容器加载的时候&#xff0c;不会立即创建Bean实例&#xff0c;等待用到时再创建Bean实例并存储到单…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战一使用鸿蒙登录组件实现客户端登录

目录 概述使用云端一体化开发模板创建项目工程创建登录入口页面集成登录SDK组件依赖登录组件SDK使用登录组件SDK 开启“手机号码”和“邮箱地址”认证方式 概述 通过本次课程&#xff0c;我们将学习怎么使用云端一体化开发模板来创建云开发工程&#xff0c;以及如何使用鸿蒙登…

外卖小程序系统:数字化餐饮的编码之道

在当今数字化时代&#xff0c;外卖小程序系统成为了餐饮业的一项技术巨制。这个系统不仅提供了便捷的点餐体验&#xff0c;更通过先进的技术手段&#xff0c;实现了高效订单处理、实时配送追踪以及个性化推荐。让我们深入了解外卖小程序系统的技术魔法&#xff0c;一起揭秘数字…

SSL加密

小王学习录 今日摘录前言HTTP + SSL = HTTPSSSL加密1. 对称加密2. 非对称加密 + 对称加密3. 证书今日摘录 但愿四海无尘沙,有人卖酒仍卖花。 前言 SSL表示安全套接层,是一个用于保护计算机网络中数据传输安全的协议。SSL通过加密来防止第三方恶意截取并篡改数据。在实际应用…

腾讯云标准型S5云主机性能评测_CPU内存_带宽系统盘测评

腾讯云服务器CVM标准型S5实例具有稳定的计算性能&#xff0c;CVM 2核2G S5活动优惠价格280.8元一年自带1M带宽&#xff0c;15个月313.2元、2核4G配置748.2元15个月&#xff0c;CPU内存配置还可以选择4核8G、8核16G等配置&#xff0c;公网带宽可选1M、3M、5M或10M&#xff0c;腾…

基于STM32CubeMX和keil采用RTC时钟周期唤醒和闹钟实现LED与BEEP周期开关

文章目录 前言1. RTC概念1.1 RTC的时钟信号源1.2 预分频器1.3 实时时钟与日历数据1.4 周期性自动唤醒1.5 可编程闹钟 2. RTC相关中断3. STM32CubeMX配置3.1 时钟配置3.2 引脚配置3.3 RTC配置3.3.1 模式选择3.3.2 RTC基本参数配置3.3 中断配置 4. 代码编写总结 前言 RTC的功能有…

Spring Boot中使用AOP统一处理Web请求日志

AOP AOP&#xff0c;也就是 Aspect-oriented Programming&#xff0c;译为面向切面编程&#xff0c;是计算机科学中的一个设计思想&#xff0c;旨在通过切面技术为业务主体增加额外的通知&#xff08;Advice&#xff09;&#xff0c;从而对声明为“切点”&#xff08;Pointcut…