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保持兼容,在稳定性、性能、容器基础设施等核心能力方面做了全面的增强和优化,能为企业提供稳定高可…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
