<泛型>带你更详细的认识泛型

了解泛型

现在有一个需求:写一个打印类,用来打印不同类型的数据

//类1 :打印Integer类型的数据
public class IntegerPrint {Integer content;public void Integer(Integer content) {this.content = content;}public void print(){System.out.println(content);}
}
//类2 :打印String类型的数据
public class StringPrint {String content;public void Integer(String  content) {this.content = content;}public void print(){System.out.println(content);}
}

如上述代码,但是我们发现如何有很多不同的类型进行打印,则需要创建很多个类,这样代码会非常冗余

而这个时候,就可以使用泛型来解决这个问题!

//<>就代表泛型,里面的T就代表传入的类型
public class Print<T> {T content;public Print(T content) {this.content = content;}public void print(){System.out.println(content);}
}

参数的约束

比如上述的代码,肯定不能让使用者随意传入类型,那我们如何进行约束呢?

上边界和下边界

  • 使用 extend 约定上边界
  • 使用 super 约定下边界

假设 XiaoMi , HuaWei 类继承 Phone

public class Main<T extends Phone> 就约束了这个类传入的只能是Phone类或者Phone类的子类

public class Main<T super XiaoMi> 则是约束了这个类传入的只能是XiaoMi类或者XiaoMi类的父类(比如Phone类)

注意:后面同样可以跟接口,不过接口要放在类的后面,比如public class FanXing<T extends Phone & Comparable> ,这个时候要求的不仅仅是继承于Phone类还要求实现了Comparable接口

通配符?

//假设我们想打印list里的数据
//类1:List里的数据为Integer类型
public class IngerPrint {public static void print(List<Integer> list) {System.out.println(list);}
}
//类2:List里的数据为String类型
public class StringPrint {//假设我们想打印list里的数据public static void print(List<String> list) {System.out.println(list);}
}

尝试优化,不让代码那么冗余,我们直接使用Object类型

image-20231001155450263

为什么呢?因为List<Object>List<Integer> 分别是一个整体,是不同的类型,那我们应如何解决呢?使用通配符即可

image-20231001155704209

关联问题

类型安全

public class FanXing {public static void main(String[] args) {List<Object> list = new ArrayList<>();list.add(123);list.add("abcd");String str = (String) list.get(0);System.out.println(str);}
}
//会报错:ClassCastExceptionException in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at FanXing.main(FanXing.java:13)

这样的时候在编译阶段是没有问题的,但是在运行时发生了报错,是因为泛型是在编译阶段进行类型检查的,而不是运行时。

通常不建议这样使用,会带来运行安全问题,并且这样的代码后期维护很麻烦。

Others

  • T :代表Type,因此通常使用使用T来代表泛型
  • wildcard:通配符
  • Question Mark:问号?
  • ClassCastException:强制类型转换异常

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

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

相关文章

Python3数据科学包系列(二):数据分析实战

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 一&#xff1a;通过read_table函数读取数据创建(DataFrame)数据框 #…

在服务器上使用nginx改变前端项目请求的url

location /app-dev {rewrite ^/app-dev/(.*) /$1 break;proxy_pass http://152.136.36.251:9999;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr; } location /请求后缀 { rewrite ^/app-dev/(.*) /$1 break; proxy_pass 想要的请求后端的url; …

九、GC收集日志

JVM由浅入深系列一、关于Java性能的误解二、Java性能概述三、了解JVM概述四、探索JVM架构五、垃圾收集基础六、HotSpot中的垃圾收集七、垃圾收集中级八、垃圾收集高级👋GC收集日志 ⚽️1. 认识GC收集日志 垃圾收集日志是一个重要的信息来源,对于与性能相关的一些悬而未决的…

Ubuntu22无法自动进入lightdm图像界面

问题&#xff1a;Ubuntu22无法自动进入lightdm图像界面&#xff0c;必须手动运行 lightdm start解决方案&#xff1a; 方案一&#xff1a; 运行一个终端输入 cat /etc/X11/default-display-manager /etc/init/lightdm.conf不接受lightdm作为设置&#xff0c;但是&#xff0c;/…

1.5.C++项目:仿muduo库实现并发服务器之socket模块的设计

项目完整版在&#xff1a; 一、socket模块&#xff1a;套接字模块 二、提供的功能 Socket模块是对套接字操作封装的一个模块&#xff0c;主要实现的socket的各项操作。 socket 模块&#xff1a;套接字的功能 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 …

uni-app:实现页面效果3

效果 代码 <template><view><!-- 风速风向检测器--><view class"content_position"><view class"content"><view class"SN"><view class"SN_title">设备1</view><view class&quo…

json/js对象的key有什么区别?

1.对于JS对象来说 一个js对象如果是这样的 obj {"0": "小明","0name": "小明明", "": 18,"&#xffe5;": "哈哈"," ": "爱好广泛" }对于js对象来说&#xff0c;有时候key是不…

2023.9.23 关于 HTTP 详解

目录 HTTP 协议 认识 URL HTTP 请求 认识方法 HTTP 响应 认识状态码 总结 HTTP 请求的构造 Form 表单构造 AJAX 构造 Postman 构造 HTTP 协议 应用层使用最广泛的协议浏览器 基于 HTTP协议 获取网站是 浏览器 和 服务器 之间的交互桥梁HTTP协议 基于传输层的 TCP协…

计算机竞赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

下载盗版网站视频并将.ts视频文件合并

. 1.分析视频请求123 2.数据获取和拼接 1.分析视频请求 1 通过抓包观察我们发现视频是由.ts文件拼接成的每一个.ts文件代表一小段2 通过观察0.ts和1.ts的url我们发现他们只有最后一段不同我们网上找到url获取的包3 我们发现index.m3u8中储存着所有的.ts文件名在拼接上前面固定…

【深度学习实验】卷积神经网络(三):自定义二维卷积层:步长、填充、输入输出通道

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 步长、填充 a. 二维互相关运算&#xff08;corr2d&#xff09; b. 二维卷积层类&#xff08;Conv2D&#xff09; c. 模型测试 d. 代码整合 2. 输入输出通道 a…

aardio 读取 Excel文件,并显示在 listview

编写 main.aardio 如下 import win.ui; /*DSG{{*/ winform win.form(text"excel1";right801;bottom500) winform.add( button1{cls"button";text"读取Excel文件";left19;top14;right126;bottom44;z1}; button2{cls"button";text&quo…

AUTOSAR汽车电子嵌入式编程精讲300篇-汽车 CAN FD 总线应用研究

目录 前言 汽车总线技术概述 汽车总线的分类与对比 汽车总线发展趋势

有向图访问计数的原理及C++实现

题目 现有一个有向图&#xff0c;其中包含 n 个节点&#xff0c;节点编号从 0 到 n - 1 。此外&#xff0c;该图还包含了 n 条有向边。 给你一个下标从 0 开始的数组 edges &#xff0c;其中 edges[i] 表示存在一条从节点 i 到节点 edges[i] 的边。 想象在图上发生以下过程&am…

mysql的mvcc详解

一 MVCC的作用 1.1 mvcc的作用 1.MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制。即通过数据行的多个版本管理来实现数据库的并发控制&#xff0c;使得在InnoDB事务隔离级别下执行一致性读操作有了保障。 2.mysql中的InnoDB中实现了MVCC主要…

前端面试:01.图中输入什么?

~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~…

ciscn_2019_s_9

ciscn_2019_s_9 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位&#xff0c;啥也没开&#xff0c;开心愉悦写shellcode int pwn() {char s[24]; // [esp8…

Linux vi编辑器的使用

文章目录 vi的简单使用打开编辑器编辑文件保存退出文件取消编辑删除内容复制粘贴移动光标搜索替换撤销和恢复 讨论 vi是linux系统上最基本的文本编辑器&#xff0c;类似于windows下的notepad&#xff08;记事本&#xff09;编辑器&#xff1b;vi编辑器工作在字符模式下&#xf…

智能回答机器人的“智能”体现在哪里?

人工智能的广泛应用已经成为当今社会科技发展的趋势之一。通过人工智能技术&#xff0c;我们可以在不同领域中实现自动化、智能化和高效化&#xff0c;从而大大提升生产和生活效率。智能回答机器人的出现和使用便能很好的证明这一点。今天我们就来探讨一下智能会打机器人的“智…

python爬取百度图片

1.查询数据 打开网页。 https://cn.bing.com/images/search?q%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87&formHDRSC2&first1&cw1585&ch924 我们右键查看网页源代码,发现能找到我们需要的img衔接,但是这是一个动态网页。我们每次向下滑动网页&#xff0c;会发现图…