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保持兼容,在稳定性、性能、容器基础设施等核心能力方面做了全面的增强和优化,能为企业提供稳定高可…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
