Java-泛型
文章目录
- Java泛型
- 什么是泛型?
- 在哪里使用泛型?
- 设计出泛型的好处是什么?
- 动手设计一个泛型
- 泛型的限定符
- 泛型擦除
- 泛型的通配符
- 结论
Java泛型
什么是泛型?
Java泛型是一种编程技术,它允许在编译期间指定使用的数据类型。使用泛型可以将数据类型从代码中分离出来,从而提高代码的可读性和灵活性。
在哪里使用泛型?
Java泛型可以应用于类、接口和方法。通常在需要对数据进行操作的情况下使用泛型。例如,在集合类中,我们使用泛型来定义集合类型。以下是一个示例,它展示了如何在List中使用泛型:
List<String> names = new ArrayList<>();
names.add("Tom");
names.add("Jerry");
String name = names.get(0); // name is "Tom"
在这个示例中,我们创建了一个List对象,并使用泛型来指定它的元素类型为String。这意味着我们只能添加字符串类型的元素到这个List中,并且从List中获取的元素类型也是String。
设计出泛型的好处是什么?
设计出泛型有以下好处:
- 增加代码的可读性和灵活性。使用泛型可以使代码更易于理解和维护,因为它可以帮助我们实现更通用的代码。
- 增强代码的类型安全性。使用泛型可以在编译时检查类型安全,从而避免在运行时出现类型错误。
- 减少了代码的重复。使用泛型可以实现更通用的代码,并避免编写重复的代码来处理不同的数据类型。
以下是一个示例,它展示了如何使用泛型来实现通用的比较方法:
public class Utils {public static <T extends Comparable<T>> T max(T[] elements) {T max = elements[0];for (int i = 1; i < elements.length; i++) {if (elements[i].compareTo(max) > 0) {max = elements[i];}}return max;}
}
在这个示例中,我们定义了一个通用的max方法,它可以比较任何实现了Comparable接口的类型。使用泛型可以将比较方法的实现与具体的数据类型分离出来,从而使代码更易于理解和维护。
动手设计一个泛型
Java泛型允许在定义类、接口或方法时使用类型参数来标识和限制类型,从而提高代码的可读性和灵活性。
以下是一个简单的泛型类的示例:
public class MyGenericClass<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}
在这个泛型类中,T是类型参数,它代表一个类型。
我们可以用以下方式来使用这个泛型类:
MyGenericClass<String> stringObj = new MyGenericClass<>();
stringObj.setValue("hello");
String value = stringObj.getValue(); // value is "hello"MyGenericClass<Integer> intObj = new MyGenericClass<>();
intObj.setValue(123);
int value = intObj.getValue(); // value is 123
在实例化MyGenericClass时,我们传入一个类型参数。在第一个示例中,我们传入了String类型,因此value的类型也是String。在第二个示例中,我们传入了Integer类型,因此value的类型也是Integer。
泛型类中的方法可以使用类型参数,就像这个示例中的setValue和getValue方法一样。在方法中使用类型参数可以让方法的输入和输出具有相同的类型。这样就可以更容易地进行类型检查和类型转换。
泛型的限定符
Java泛型中的限定符允许我们对类型参数进行约束,以确保它们满足某些条件。
以下是一个示例,它展示了如何使用泛型的限定符来限制类型参数:
public class MyGenericClass<T extends Number> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}
在这个示例中,我们使用extends关键字将类型参数T限制为Number或Number的子类。这意味着我们可以在setValue方法中传入任何Number类型的对象,例如Integer或Double,但不能传入其他类型的对象。
泛型擦除
Java泛型背后的实现是通过类型擦除来实现的。这意味着编译器在编译时会将泛型转换为它们的原始类型。
以下是一个示例:
MyGenericClass<String> stringObj = new MyGenericClass<>();
在编译时,编译器将MyGenericClass转换为MyGenericClass,因为类型参数被擦除了。这意味着在运行时,我们无法使用泛型类型信息。
泛型的通配符
Java泛型还支持通配符,它允许我们在方法调用中使用任何类型的实参。通配符用?表示。
以下是一个示例:
public static void printList(List<?> list) {for (Object obj : list) {System.out.println(obj);}
}
在这个示例中,我们使用通配符来接受任何类型的List。这意味着我们可以传入一个List或List,但在方法中我们只能访问它们的共同超类型Object。
结论
Java泛型提供了一种有效的方式来增加代码的可读性和灵活性。使用泛型,我们可以在编译时检查类型安全,并且可以编写通用的代码,而不必写重复的代码,以处理不同的数据类型。在设计泛型时,需要考虑泛型限定符、泛型擦除和泛型通配符等因素。
相关文章:

Java-泛型
文章目录 Java泛型什么是泛型?在哪里使用泛型?设计出泛型的好处是什么?动手设计一个泛型泛型的限定符泛型擦除泛型的通配符 结论 Java泛型 什么是泛型? Java泛型是一种编程技术,它允许在编译期间指定使用的数据类型。…...

【python爬虫】8.温故而知新
文章目录 前言回顾前路代码实现体验代码功能拆解获取数据解析提取数据存储数据 程序实现与总结 前言 Hello又见面了!上一关我们学习了爬虫数据的存储,并成功将QQ音乐周杰伦歌曲信息的数据存储进了csv文件和excel文件。 学到这里,说明你已经…...
vue3组合式api 父子组件数据同步v-model语法糖的用法
V-model 大多数情况是用在 表单数据上的, 但它不止这一个作用 父子组件的数据同步, 有一个 语法糖 v-model,这个方法简化了语法, 在elementplus中,都有很多地方使用, 所以我们要理解清楚 父组件 使用 v-mod…...

环境异常总结
1.vue项目 npm run dev 运行时报错:webpack-dev-server --inline --progress --config build/webpack.dev.conf.js 不是内部或外部命令 原因:webpack-dev-server存在问题 解决方案:指定 webpack-dev-server 低版本号 方法: 删除 …...

[论文笔记]DSSM
引言 这是DSSM论文的阅读笔记,后续会有一篇文章来复现它并在中文数据集上验证效果。 本文的标题翻译过来就是利用点击数据学习网页搜索中深层结构化语义模型,这篇论文被归类为信息检索,但也可以用来做文本匹配。 这是一篇经典的工作,在DSSM之前,通常使用传统机器学习的…...

Skip Connection——提高深度神经网络性能的利器
可以参考一下这篇知乎所讲 https://zhuanlan.zhihu.com/p/457590578 长跳跃连接用于将信息从编码器传播到解码器,以恢复在下采样期间丢失的信息...

EXCEL中点击单元格,所在行和列都改变颜色
在日常工作中,尤其是办公室工作人群,尝尝需要处理大量的数据,在对数据进行修改时,时长发生看错行的事情,导致数据越改越乱,因此,我常用的一种方法就是选中单元格时,所在行、列标记为…...
HAProxy(一)
四层负载均衡与七层负载均衡区别 四层负载均衡和七层负载均衡是两种不同的负载均衡方式,主要区别在于负载均衡的层级及其所支持的协议不同。 四层负载均衡,也称为传输层负载均衡,工作在 OSI 模型的传输层(第四层)&am…...

LeetCode--HOT100题(46)
目录 题目描述:114. 二叉树展开为链表(中等)题目接口解题思路代码 PS: 题目描述:114. 二叉树展开为链表(中等) 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链…...

深度探索JavaScript中的原型链机制
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…...

一种基于WinDump自动抓包实现方法
本发明的技术方案包括以下步骤和组件: 配置抓包参数:设置抓包的IP、端口以及过滤包大小等参数,以控制抓取的数据范围。循环自动抓包:利用WinDump工具实现循环自动抓包功能,类似于记录日志的方式保留抓包数据。当抓包数…...
taro 支付宝/微信小程序/h5 上传 - base64的那些事儿
支付宝小程序临时path转base64 - 基础库2.0以下 function getImageInfo(path) {return new Promise(resolve > {my.getImageInfo({src: path,success: res > {resolve(res)}})}) } export async function getBase64InAlipay({ id, path }) {const { width, height } awa…...

java之SpringBoot基础、前后端项目、MyBatisPlus、MySQL、vue、elementUi
文章目录 前言JC-1.快速上手SpringBootJC-1-1.SpringBoot入门程序制作(一)JC-1-2.SpringBoot入门程序制作(二)JC-1-3.SpringBoot入门程序制作(三)JC-1-4.SpringBoot入门程序制作(四)…...

Vue-Router 一篇搞定 Vue3
前言 在 Web 前端开发中,路由是非常重要的一环,但是路由到底是什么呢? 从路由的用途上讲 路由是指随着浏览器地址栏的变化,展示给用户不同的页面。 从路由的实现原理上讲 路由是URL到函数的映射。它将 URL 和应用程序的不同部分…...

深度解读智能媒体服务的重组和进化
统一“顶设”的智能媒体服务。 邹娟|演讲者 大家好,首先欢迎各位来到LVS的阿里云专场,我是来自阿里云视频云的邹娟。我本次分享的主题为《从规模化到全智能:智能媒体服务的重组与进化》。 本次分享分为以上四部分,一是…...

亲测有效!Win7中如何安装高版本的NodeJS
正常情况下,Win7支持的Node.js最高版本是V13.14,但在开发过程中,有不少Vue项目或其他需要依赖Node环境的项目,对Node版本要求都比较高。对此,我们要么重装操作系统到Win8以上,要么就得想办法在Win7中安装高…...
Python基础__with open()用法
1、open与with open区别 open()完成后必须调用close()方法关闭文件,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,由于文件读写时都有可能产生IOError,一旦出错&…...
深入理解 JavaScript 对象、属性、解构和增强语法
ECMA-262将对象定义为一组属性的无序集合。 1 内部属性描述 1.1 数据属性 [[Configurable]]:可配置性,直接定义在对象的属性该特性默认为true,表示可以对属性进行删除、修改等操作。[[Enumerable]]:可枚举性,直接定…...

2023年IT服务行业研究报告
第一章 行业概况 1.1 定义 IT服务行业是一个广泛的术语,涵盖了所有提供技术支持和服务的公司。这些服务包括系统集成,云计算服务,软件和硬件支持,网络服务,咨询服务,以及一系列其他类型的技术服务。此外&…...
腾讯云服务器镜像TencentOS Server有用过的吗?
腾讯云服务器镜像TencentOS Server操作系统有用过的吗?踩过坑吗?TencentOS性能和稳定性如何?TencentOS Server与CentOS保持兼容,在稳定性、性能、容器基础设施等核心能力方面做了全面的增强和优化,能为企业提供稳定高可…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...