【java基础】泛型的通配符(extends,super,?)

news2024/11/15 15:56:11

文章目录

  • 基本概念
  • 通配符extends
  • 通配符super
  • 无限定通配符?
  • 总结

基本概念

如果不使用通配符,那么我们在使用了泛型之后就不允许类型参数发生改变了,但是有了通配符就可以更加灵活的控制类型参数,类型参数可以发生改变。下面准备了3个类用于演示

public class A {

}
public class B extends A {

}
public class C extends B {

}

通配符extends

我们使用这个通配符可以限制类型参数是某个类(接口)或者是其子类。

    public static <T extends AutoCloseable> void close(T t) {
        try {
            t.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

上面代码中我就限定了T是AutoCloseable的实现类,由于是它的实现类,那么AutoCloseable的方法当然也就可以调用了。

如果不需要用到T,那么就可以使用?代替,个数如下

    public static void printList(List<? extends B> list) {
        for (B b : list) {
            System.out.println(b);
        }
    }

上面的List<? extends B>就代表传入的List只能是B类或其子类类型的集合
需要注意的是,对于extends,我们不能够填充元素,也就是写操作

    public static void printList(List<? extends B> list) {
        list.add(new B());
    }

上面代码会出现错误

在这里插入图片描述

原因就是编译器知道要传入的参数是某个类型的子类型,但不知道具体是哪个子类型


通配符super

这个通配符可以限制参数类型为某个类或者为其父类

    public static void downLimit(List<? super B> list) {
        // list.add(new C());
        // list.add(new B());
        for (Object o : list) {
            System.out.println(o);
        }
    }

List<? super B>就表示传入的类型为B或B的父类的集合。对于super,由于不知道具体传入的是什么,所以就只能使用Object接收了。

对于super,我们可以填充元素

    public static void downLimit(List<? super B> list) {
        list.add(new C());
        list.add(new B());
    }

对于这种情况,我的理解就是将父类转换为子类不会造成信息丢失,但是由子类转换为父类可能会造成信息丢失。

下面就是java核心卷中给出的总结

带有超类型限定的通配符允许你写入一个泛型对象,而带有子类型限定的通配符允许你读取一个泛型对象。

无限定通配符?

下面就来看一个例子分析一下一个Tool类

public class Tool<T> {

    private T info;

    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }
}

对于Tool<?>会有以下2个方法

? getInf()
void setInfo(?)

对于getInfo,可以调用,返回值只能赋给Object。对于setInfo,根本不能调用(如果调用只能传入null),因为不知道?是什么。

对于?,通常都是为了避免使用泛型方法。<?>就表示匹配任意类型,和extends和super一起使用分别就表示上限和下限

总结

这一节感觉自己都有点模糊,java核心卷在泛型这章讲的真的是晦涩难懂,如果上面有说错的地方,欢迎大家私信或者评论区指出。

关于泛型的更多知识,参考以下内容

泛型程序设计基础
类型擦除、桥方法、泛型代码和虚拟机
泛型的限制及其继承规则
泛型的通配符(extends,super,?)

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

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

相关文章

【MAC OS 命令行】Redis的安装、启动和停止。就是如此简单

目录Mac 安装 Redis使用 Homebrew 安装 Redis总结Mac 安装 Redis 使用 Homebrew 安装 Redis 如果没有安装 Homebrew&#xff0c;先安装 Homebrew 执行命令&#xff1a; 方法一、brew 官网的安装脚本 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homeb…

浮点数的表示和运算

文章目录浮点数的表示表示溢出规格化IEEE754格式浮点数真值的计算公式范围浮点数的加减浮点数的乘除刷题小结浮点数的表示 表示 为什么会有浮点数&#xff1f;位数有限的情况下&#xff0c;既扩大了数的范围&#xff0c;也保持了数的精度。 浮点数的意思是小数点是浮动的&…

ERP(企业资源管理)概述

&#x1f31f;所属专栏&#xff1a;ERP企业资源管理&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新ERP的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章简介&a…

利用Python按数字顺序批量修改文件名称

为了按顺序修改文件名称&#xff0c;采用对【文件名称列表】进行排序的方法。 要对列表进行排序&#xff0c;这里使用列表的sort()方法。这个方法会在不创建新的列表的情况下直接对列表进行排序。 逆序排列&#xff1a;sort(reverseTrue) files.sort()结果还是不理想&#x…

quarkus 搭建与基础开发环境配置总结

quarkus搭建与基础开发环境配置总结 大纲 基础概念quarkus2.13.7脚手架工程配置配置maven3.8.7quarkus快速启动quarkus的三种打包方式quarkus将程序打包为二进制文件window环境下quarkus云原生二进制文件打包环境搭建使用GraalVM-java11替换本地java8运行二进制文件 基础概念…

Linux操作系统学习(线程同步)

文章目录线程同步条件变量生产者与消费者模型信号量环形队列应用生产者消费者模型线程同步 ​ 现实生活中我们经常会遇到同一个资源多个人都想使用的问题&#xff0c;例如游乐园过山车排队&#xff0c;玩完的游客还想再玩&#xff0c;最好的办法就是玩完的游客想再玩就去重新排…

分享几种WordPress怎么实现相关文章功能

一淘模板&#xff08;56admin.com&#xff09;给大家介绍一下WordPress代码实现相关文章的几种方法&#xff0c;希望对大家有所帮助&#xff01; WordPress很多插件可以实现相关文章的功能&#xff0c;插件的优点是配置简单&#xff0c;但是可能会对网站的速度造成一些小的影响…

做数据分析有前景吗?

当然有前景的。 每个行业都有发展前景&#xff0c;只是看你自身的技能情况或者关系人脉、软实力方面是否到位&#xff0c;不同的行业要求不一样。作为数据分析领域而言&#xff0c;属于IT行业&#xff0c;看的是你的专业技能&#xff1b;只要你技能过硬&#xff0c;就能在行业…

蓝桥杯 时间显示

题目 输入输出样例 示例 1 输入 46800999输出 13:00:00示例 2 输入 1618708103123输出 01:08:23评测用例规模与约定 对于所有评测用例&#xff0c;给定的时间为不超过 10^{18}1018 的正整数。 运行限制 最大运行时间&#xff1a;1s最大运行内存: 512M 基础知识 时间的转换…

Go底层原理:一起来唠唠GMP调度(一)

目录前言一、进程、线程、Goroutine1、进程与线程2、Goroutine二、Go调度器设计思想1、线程模型1.1 内核级线程模型1.2 用户级线程模型1.3 混合型线程模型2、 被废弃的 G-M 调度器2.1 了解 G-M 调度如何工作3、如今高效的 GMP 模型3.1 GMP模型调度流程3.2 GMP调度设计策略3.3 G…

【Vue3】封装数字框组件

数量选择组件-基本结构 &#xff08;1&#xff09;准备基本结构 <script lang"ts" setup name"Numbox"> // </script> <template><div class"numbox"><div class"label">数量</div><div cla…

C语言-基础了解-19-C位域

C位域 一、C位域 如果程序的结构中包含多个开关量&#xff0c;只有 TRUE/FALSE 变量&#xff0c;如下&#xff1a; struct {unsigned int widthValidated;unsigned int heightValidated; } status;这种结构需要 8 字节的内存空间&#xff0c;但在实际上&#xff0c;在每个变…

引领云数仓创新浪潮 HashData闪耀PostgreSQL中国技术大会

3月3日-3月5日&#xff0c;第12届PostgreSQL中国技术大会在杭州举行。本次大会以“突破•进化•共赢——安全可靠&#xff0c;共建与机遇”为主题&#xff0c;以线上线上结合的方式&#xff0c;邀请了PG领域众多行业大咖、学术精英及技术专家&#xff0c;共同探讨数据库未来的发…

【C/C++ 数据结构】-八大排序之 归并排序其它排序

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【C/C数据结构与算法】 分享&#xff1a;本王在此&#xff0c;狼狈为奸者&#xff0c;谋权篡位者&#xff0c;倒行逆施者&#xff0c;都得死&#xff01; ——岐王李茂贞《画江湖…

Linux 静态与动态编译、静态库与动态库

文章目录一、库的简介二、静态链接和动态链接1、静态链接2、动态链接3、GCC 下动态库与静态库三、静态库制作和使用四、动态库制作和使用总结一、库的简介 什么是库文件呢&#xff1f; 所谓库文件&#xff0c;大家可以将其等价为压缩包文件&#xff0c;该文件内部通常包含不止…

MyBatis源码分析(六)MetaObject工具类的使用与源码分析

文章目录一、MetaObject基本使用二、关键类源码分析1、MetaObject的构造方法2、PropertyTokenizer分词器3、BeanWrapper4、MetaClass5、DefaultReflectorFactory6、Reflector7、总结三、MetaObject的getValue源码分析写在后面一、MetaObject基本使用 public class User {priva…

OPT(奥普特)一键测量传感器SmartFlash高精度的四重保证

OPT&#xff08;奥普特&#xff09;一键测量传感器SmartFlash集成了机器视觉的边缘提取、自动匹配、自动对焦、自动学习及图像合成等人工智能技术&#xff0c;采用双远心光路及多角度照明系统设计&#xff0c;搭载高精度运动平台&#xff0c;并通过亚像素边缘提取算法处理图像&…

Mysql全解[中级篇]

目录存储引擎MySQL体系结构1). 连接层2). 服务层3). 引擎层4). 存储层存储引擎介绍存储引擎特点InnoDBMyISAMMemory文件区别及特点存储引擎选择索引无索引情况有索引情况特点索引结构二叉树红黑树B-TreeBTreeMySQL中优化之后的BTreeHash索引分类聚集索引&二级索引回表查询索…

双周赛99(贪心、数学、区间合并计算、换根DP)

文章目录双周赛99[6312. 最小和分割](https://leetcode.cn/problems/split-with-minimum-sum/)贪心[6311. 统计染色格子数](https://leetcode.cn/problems/count-total-number-of-colored-cells/)找规律[6313. 统计将重叠区间合并成组的方案数](https://leetcode.cn/problems/c…

规并排序(Swift版本)

Overview 概述 时间复杂度为 O(nlogn) ;适合大规模的数据排序 ;相比于冒泡排序、插入排序、选择排序这三种排序算法, 更加常用 ;用到了分治思想(即分而治之, 英文叫 “Divide and conquer”)&#xff0c;非常巧妙 ;英文名称: Merge Sort ; 分治思想, 在很多领域都有广泛的应用…