Java数据结构之第十四章、泛型进阶

news2025/1/10 23:28:42

补充复杂示例:

public class MyArray<E extends Comparable<E>> {
...
}

表明E必须是实现了Comparable接口的

泛型基础内容

目录

一、通配符

二、通配符上界

三、通配符下界


一、通配符

? 用于在泛型的使用,即为通配符 

示例:

class Message<T> {
    private T message ;
    public T getMessage() {
        return message;
    }
    public void setMessage(T message) {
        this.message = message;
    }
}
public class TestDemo {
    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());
    }
}

以上程序会带来新的问题,如果现在泛型的类型设置的不是String,而是Integer.

public class TestDemo {
    public static void main(String[] args) {
        Message<Integer> message = new Message();
        message.setMessage(99);
        fun(message); // 出现错误,只能接收String
    }

    public static void fun(Message<String> temp) {
        System.out.println(temp.getMessage());
    }
}

我们需要的解决方案:可以接收所有的泛型类型,但是又不能够让用户随意修改。这种情况就需要使用通配符"?"来处理
范例:使用通配符:

public class TestDemo {
    public static void main(String[] args) {
        Message<Integer> message = new Message() ;
        message.setMessage(55);
        fun(message);
    }
    // 此时使用通配符"?"描述的是它可以接收任意类型,但是由于不确定类型,所以无法修改
    public static void fun(Message<?> temp){
//temp.setMessage(100); 无法修改!
        System.out.println(temp.getMessage());
    }
}

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


二、通配符上界

语法:

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

class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Banana extends Fruit {
}
class Message<T> { // 设置泛型
    private T message ;
    public T getMessage() {
        return message;
    }
    public void setMessage(T message) {
        this.message = message;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Message<Apple> message = new Message<>() ;
        message.setMessage(new Apple());
        fun(message);
        Message<Banana> message2 = new Message<>() ;
        message2.setMessage(new Banana());fun(message2);
    }
    // 此时使用通配符"?"描述的是它可以接收任意类型,但是由于不确定类型,所以无法修改
    public static void fun(Message<? extends Fruit> temp){
//temp.setMessage(new Banana()); //仍然无法修改!
//temp.setMessage(new Apple()); //仍然无法修改!
        System.out.println(temp.getMessage());
    }
}

 此时无法在fun函数中对temp进行添加元素,因为temp接收的是Fruit和他的子类,此时存储的元素应该是哪个子类无法确定。所以添加会报错!但是可以获取元素。

public static void fun(Message<? extends Fruit> temp){
//temp.setMessage(new Banana()); //仍然无法修改!
//temp.setMessage(new Apple()); //仍然无法修改!
        Fruit b = temp.getMessage();
        System.out.println(b);
    }

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


三、通配符下界

语法:

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

class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Plate<T> {
    private T plate ;
    public T getPlate() {
        return plate;
    }
    public void setPlate(T plate) {
        this.plate = plate;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Plate<Fruit> plate1 = new Plate<>();
        plate1.setPlate(new Fruit());
        fun(plate1);
        Plate<Food> plate2 = new Plate<>();
        plate2.setPlate(new Food());
        fun(plate2);
    }
    public static void fun(Plate<? super Fruit> temp){
// 此时可以修改!!添加的是Fruit 或者Fruit的子类
        temp.setPlate(new Apple());//这个是Fruit的子类
        temp.setPlate(new Fruit());//这个是Fruit的本身
//Fruit fruit = temp.getPlate(); 不能接收,这里无法确定是哪个父类
        System.out.println(temp.getPlate());//只能直接输出
    }
}

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

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

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

相关文章

如何使用 Python Nornir 实现基于 CLI 的网络自动化?

在现代网络环境中&#xff0c;网络自动化已成为管理和配置网络设备的重要工具。Python Nornir 是一个强大的自动化框架&#xff0c;它提供了一个简单而灵活的方式来执行网络自动化任务。本文将详细介绍如何使用 Python Nornir 实现基于 CLI 的网络自动化。 1. Python Nornir 概…

jacoco增量覆盖率平台开发

先聊聊做这个平台的意义&#xff0c;从项目管理角度来说&#xff0c;测试说项目测试完成&#xff0c;该如何证明呢&#xff1f;一般情况下我们进行验收时没什么问题就算完成了&#xff0c;但是实际上测试很多情况并没有考虑到。所以该平台可以反哺测试的测试用例&#xff0c;让…

GO的服务

1.go的安装 1.1 确认版本go version go version go1.20.4 darwin/amd64 可以看到是macos10.14版本。如果是m1 需要安装对应的版本 1.2 用vscode 进行编写go的简单例子 先进入vscode的界面&#xff0c;新建一个目录为godemo&#xff0c;里面就是go的例子的工作目录&#xff0…

计算机的大小端存储模式(计算机小白必看!)

目录 1.什么是大端小端 2.为什么会有大小端模式之分呢&#xff1f; 3.如何判断当前机器为大端字节序还是小端字节序 本文将介绍计算机存储数据时的大小端问题 1.什么是大端小端 大端&#xff08;存储&#xff09;模式&#xff0c;是指数据的低位保存在内存的高地址中&…

可视化库seaborn常用操作介绍

目录 1.seaborn 概括2.Seaborn的调色板3.单变量绘图分析4.回归分析绘图5.分类图绘制6.FacetGrid使用7.Heatmap 1.seaborn 概括 seaborn库是一个用于数据可视化的Python库&#xff0c;它建立在matplotlib之上&#xff0c;可以让你轻松地创建各种美观的图表和图形。 在seaborn中…

致敬科技工作者:我们的世界因你们而美好

在我们的日常生活中&#xff0c;科技无处不在&#xff0c;而这一切离不开科技工作者的辛勤付出。作为一名科技从业者&#xff0c;我深深地理解并感悟到&#xff0c;科技工作者们的作用是不可替代的。 二十一世纪&#xff0c;科技的发展日新月异。我们见证了第一台计算机的发明…

RT1170启动详解:Boot配置、Bootable image头的组成

文章目录 1 基础知识2 BOOT配置2.1 BOOT_CFG配置2.2 BOOT_MODE 3 Bootable image3.1 文件格式3.2 Bootable image头的组成3.3 Bootable image的生成3.4 例&#xff1a;BootROM之non-XIP加载过程3.5 例&#xff1a;bin文件分析 1 基础知识 &#xff08;1&#xff09;BootROM Bo…

地面分割--Patchwork

文章目录 1问题定义2同心区域模型3按照区域划分的平面拟合4地面点似然估计&#xff08;GLE&#xff09;总结 patchwork是一种比较优秀的地面分割方法。其过程主要分为三个部分&#xff1a;同心圆环区域(CZM:concentric Zone Model)&#xff0c;按照区域划分的平面拟合(R-GPF:re…

OpenCV基础操作(5)图像平滑、形态学转换、图像梯度

import numpy as np import cv2 as cv from matplotlib import pyplot as plt一、图像平滑 1、2D卷积 我们可以对 2D 图像实施低通滤波&#xff08;LPF&#xff09;&#xff0c;高通滤波&#xff08;HPF&#xff09;等。 LPF 帮助我们去除噪音&#xff0c;模糊图像。HPF 帮助…

【数字信号处理】Goertzl算法详解推导及双音多频(DTMF)信号检测

Geortzel算法 【要点解析】 根据卷积公式 y ( n ) = ∑ m = − ∞ ∞ x ( m )

前端切图仔跑路真经

一、闭包 谈到闭包&#xff0c;我们首先要讨论的就是作用域。 1、作用域&#xff1a; 是指程序源代码中代码定义的范围。规定了如何设置变量&#xff0c;也就是确定了当前执行代码对变量的访问权限。 JavaScript采用词法作用域&#xff0c;也就是静态作用域&#xff0c;就是在…

直接带你使用 FreeRTOS 的 API 函数(基于 CubeMX 生成)(不断更新)

作者有话要说 对于这个越来约浮躁的社会&#xff0c;什么都要钱&#xff0c;特别是网上那些垃圾教程&#xff0c;越听越模糊&#xff0c;那行吧&#xff0c;我直接就从 FreeRTOS 的 API函数 学起&#xff0c;管你这么多底层内容的&#xff0c;以后再说吧&#xff01;&#xff0…

[中间件漏洞]apache漏洞复现

目录 apache未知扩展名解析漏洞 漏洞复现 防范建议 AddHandler导致的解析漏洞 防范建议 Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 漏洞复现 防范建议 apache未知扩展名解析漏洞 Apache默认一个文件可以有多个以点分割的后缀&#xff0c;当最右边的后缀…

【LeetCode热题100】打卡第5天:最长回文子串

文章目录 最长回文子串⛅前言&#x1f512;题目&#x1f511;题解 最长回文子串 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识…

部署OA系统

文章目录 前言一、OA系统基础1.OA系统2.魔方OA3.OA系统架构4.部署OA系统 二、使用步骤总结 前言 部署OA系统&#xff0c;以魔方OA为例 一、OA系统基础 1.OA系统 办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化…

⑥电子产品拆解分析-食物电子秤

⑥电子产品拆解分析-食物电子秤 一、功能介绍二、电路分析以及器件作用三、原理图复现与学习1、电源电路2、按键电路3、其它接口电路 一、功能介绍 ①高精度0.1g称重&#xff1b;②内置锂电池和外加2个7号电池超长续航&#xff1b;③可进行克和盎司单位称重&#xff1b;④一键智…

Flask or FastAPI? Python服务端初体验

1. 引言 最近由于工作需要&#xff0c;又去了解了一下简单的python服务搭建的相关工作&#xff0c;主要是为了自己开发的模型或者工具给同组的人使用。之前介绍的针对于数据科学研究比较友好的一个可以展示的前端框架Streamlit可以说是一个利器。不过&#xff0c;随着ChatGPT的…

由前序和中序创建二叉树

算法分析 首先&#xff0c;前序是按照 根 -> 左子树 -> 右子树 这样的顺序来进行访问的&#xff0c;也就是说&#xff0c;前序给出的顺序一定是先给出根结点的&#xff0c;那么我们就可以根据前序的顺序来依次递归判断出每个子树的根结点了。 如下所示&#xff1a; 我…

源码角度分析多线程并发情况下数据异常回滚方案

一、 多线程并发情况下数据异常回滚解决方案 在需要多个没有前后顺序的数据操作情况下&#xff0c;一般我们可以选择使用并发的形式去操作&#xff0c;以提高处理的速度&#xff0c;但并发情况下&#xff0c;我们使用 Transactional 还能解决事务回滚问题吗。 例如有下面表结…

Go语言并发

Go语言并发学习目标 出色的并发性是Go语言的特色之一 • 理解并发与并行• 理解进程和线程• 掌握Go语言中的Goroutine和channel• 掌握select分支语句• 掌握sync包的应用 并发与并行 并发与并行的概念这里不再赘述, 可以看看之前java版写的并发实践; 进程和线程 程序、进程…