java泛型类与泛型方法
Java泛型类和泛型方法是Java泛型编程中的重要组成部分。它们允许开发者编写类型安全且高度复用的代码。下面详细介绍泛型类和泛型方法的概念、用法和示例。
泛型类
泛型类是在类定义中使用类型参数的类,可以指定具体的类型实例化该类。这样可以确保类型安全,并且提高代码的复用性。
声明泛型类
泛型类的声明格式如下:
1public class ClassName<TypeParameters> {
2 // 类成员
3}
其中,TypeParameters是一个或多个类型参数的列表,用逗号分隔。类型参数通常使用大写字母表示,如T、E、K、V等。
示例1:简单泛型类
1public class Box<T> {
2 private T item;
3
4 public Box(T item) {
5 this.item = item;
6 }
7
8 public T getItem() {
9 return item;
10 }
11
12 public void setItem(T item) {
13 this.item = item;
14 }
15}
16
17// 使用泛型类
18Box<String> stringBox = new Box<>("Hello");
19String value = stringBox.getItem(); // 编译时类型检查
在这个例子中,Box类使用类型参数T,表示可以存储任何类型的对象。实例化时指定具体类型,如Box<String>。
示例2:泛型类的继承
泛型类也可以继承其他类,并且可以指定父类的类型参数。
1public class Box<T> {
2 private T item;
3
4 public Box(T item) {
5 this.item = item;
6 }
7
8 public T getItem() {
9 return item;
10 }
11
12 public void setItem(T item) {
13 this.item = item;
14 }
15}
16
17public class NumberBox<T extends Number> extends Box<T> {
18 public NumberBox(T item) {
19 super(item);
20 }
21}
22
23// 使用泛型类的继承
24NumberBox<Integer> intBox = new NumberBox<>(123);
25Integer value = intBox.getItem(); // 编译时类型检查
在这个例子中,NumberBox类继承自Box类,并且指定了类型参数T必须是Number的子类型。
泛型方法
泛型方法是在方法定义中使用类型参数的方法,可以在非泛型类或接口中声明。泛型方法允许在方法内部使用泛型类型参数,从而实现类型安全的代码。
声明泛型方法
泛型方法的声明格式如下:
1public ReturnType methodName<TypeParameters>(ParameterTypes...) {
2 // 方法体
3}
其中,TypeParameters是一个或多个类型参数的列表,用逗号分隔。
示例1:简单泛型方法
1public class Utility {
2 public static <T> void printArray(T[] array) {
3 for (T element : array) {
4 System.out.println(element);
5 }
6 }
7}
8
9// 使用泛型方法
10Integer[] intArray = {1, 2, 3};
11Utility.printArray(intArray);
在这个例子中,printArray方法使用类型参数T,表示可以处理任何类型的数组。调用时指定具体类型,如Integer[]。
示例2:泛型方法的返回值
泛型方法也可以返回泛型类型的值。
1public class Utility {
2 public static <T> T max(T[] array, Comparator<T> comparator) {
3 if (array == null || array.length == 0) {
4 throw new IllegalArgumentException("Array must not be null or empty.");
5 }
6
7 T maxElement = array[0];
8 for (int i = 1; i < array.length; i++) {
9 if (comparator.compare(array[i], maxElement) > 0) {
10 maxElement = array[i];
11 }
12 }
13
14 return maxElement;
15 }
16}
17
18// 使用泛型方法的返回值
19Integer[] intArray = {1, 2, 3};
20Comparator<Integer> comparator = Integer::compare;
21Integer maxValue = Utility.max(intArray, comparator);
22System.out.println("Max value: " + maxValue); // 输出 Max value: 3
在这个例子中,max方法返回最大值,类型参数T表示数组元素的类型。
泛型类与泛型方法的组合
泛型类和泛型方法可以结合使用,以实现更加灵活的类型安全代码。
示例3:泛型类与泛型方法的组合
1public class Box<T> {
2 private T item;
3
4 public Box(T item) {
5 this.item = item;
6 }
7
8 public T getItem() {
9 return item;
10 }
11
12 public void setItem(T item) {
13 this.item = item;
14 }
15
16 public <U> void swap(Box<U> other) {
17 T temp = this.item;
18 this.item = other.getItem();
19 other.setItem(temp);
20 }
21}
22
23// 使用泛型类与泛型方法的组合
24Box<Integer> intBox = new Box<>(123);
25Box<String> stringBox = new Box<>("Hello");
26
27intBox.swap(stringBox);
28
29Integer intValue = intBox.getItem(); // 输出 Hello
30String stringValue = stringBox.getItem(); // 输出 123
在这个例子中,Box类有一个泛型方法swap,用于交换两个不同类型的Box对象的内容。
类型通配符
类型通配符通常使用?表示,可以表示任何类型。这在处理不确定类型的集合时非常有用。
示例4:使用类型通配符
1public class Utility {
2 public static void printCollection(Collection<?> collection) {
3 for (Object element : collection) {
4 System.out.println(element);
5 }
6 }
7}
8
9// 使用类型通配符
10List<Integer> intList = Arrays.asList(1, 2, 3);
11Utility.printCollection(intList);
在这个例子中,printCollection方法接受任何类型的Collection,使用类型通配符?。
泛型的限制
虽然泛型提供了类型安全和代码复用的优点,但也有一些限制:
- 类型擦除:泛型类型在编译时进行类型检查,但在运行时会被擦除成对应的原始类型。
- 通配符限制:使用类型通配符时需要注意限制条件,避免类型错误。
- 强制类型转换:尽管使用泛型可以减少强制类型转换,但在某些情况下仍然需要显式的类型转换。
总结
Java泛型类和泛型方法是Java泛型编程的重要组成部分。它们允许开发者编写类型安全且高度复用的代码。通过使用泛型类和泛型方法,可以显著提高代码的可读性和可维护性。掌握这些基本概念和用法后,可以进一步探索更高级的泛型特性,如泛型通配符、边界类型等,以实现更加复杂的类型安全需求。
相关文章:
java泛型类与泛型方法
Java泛型类和泛型方法是Java泛型编程中的重要组成部分。它们允许开发者编写类型安全且高度复用的代码。下面详细介绍泛型类和泛型方法的概念、用法和示例。 泛型类 泛型类是在类定义中使用类型参数的类,可以指定具体的类型实例化该类。这样可以确保类型安全&#…...
Android String资源文件中,空格、换行以及特殊字符如何表示
空格: 例:<string name"test">test test</string> 换行:\n 例:<string name"test">test \n test</string> tab:\t …...
CUDA及GPU学习资源汇总
CUDA C Programming Guide 的中文翻译版GPU中的SM和warp的关系推荐几个不错的CUDA入门教程CUDA编程入门极简教程...
uniapp vue3 梯形选项卡组件
实现的效果图: 切换选项卡显示不同的内容,把这个选项卡做成了一个组件,需要的自取。 // 组件名为 trapezoidalTab <template> <view class"pd24"><view class"nav"><!-- 左侧 --><view cla…...
如何在微信小程序中实现WebSocket连接
微信小程序作为一种全新的应用形态,凭借其便捷性、易用性受到了广大用户的喜爱。在实际开发过程中,实时通信功能是很多小程序必备的需求。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,能够实现客户端与服务器之间的实时通信。本文…...
二级等保测评中安全物理环境的重要性及高危项分析
当今数字化时代,信息安全至关重要。网络安全等级保护测评是确保信息系统安全稳定运行的重要手段之一,其中二级等保测评对于许多企业和组织来说是必须要达到的安全标准。 而安全物理环境作为等保测评的重要组成部分,其重要性不容忽视。 安全物…...
C++11——lambda
lambda lambda的介绍lambda的使用lambda的细节->捕捉列表 lambda的介绍 lambda是匿名函数,再适合的场景去使用可以提高代码的可读性。 场景: 假设有一个Goods类需要进行按照价格、数量排序 class Goods {string name;size_t _price;//价格int num;/…...
Dubbo3序列化安全问题
序列化安全 在 Dubbo 3.0 中,序列化协议的安全性得到了加强。 1. 序列化安全性升级 Triple 协议: 推荐使用 Triple 协议 的非 Wrapper 模式,该模式在安全性上更为严格。需要开发人员编写 IDL(接口描述语言)文件,这虽…...
秒懂Linux之共享内存
目录 共享内存概念 模拟实现共享内存 创建key阶段 编辑创建共享内存阶段 删除共享内存阶段 查看共享内存属性阶段 挂接共享内存到进程阶段 取消共享内存与进程挂接阶段 进程通信阶段 添加管道改进版 共享内存函数 shmget函数 shmat函数 shmdt函数 shmctl函数 共享内存概念 共…...
【计算机网络】网络层协议解析
网络层的两种服务IPv4分类编址划分子网无分类地址 IPv4地址应用IP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报 IPv4数据报首部格式ICMP网际控制报文协议虚拟专用网VPN与网络地址转换NAT 网络层主要任务是实现网络互连,进而实现数据包在各网络之间的传…...
sqlist void reverse(SqList A)
#include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; #define INIT_SIZE 5 #define INCREMENT 10 # define OK 1 # define ERROR 0/* 定义ElemType为int类型 */ typedef int ElemType; void input(ElemType &s); void out…...
聊聊Thread Local Storage
聊聊ThreadLocal 为什么需要Thread Local StorageThread Local Storage的实现PThread库实现操作系统实现GCC __thread关键字实现C11 thread_local实现JAVA ThreadLocal实现 Thread Local Storage 线程局部存储,简称TLS。 为什么需要Thread Local Storage 变量分为全…...
WEB攻防-JS项目Node.js框架安全识别审计验证绕过
知识点: 1、原生JS&开发框架-安全条件 2、常见安全问题-前端验证&未授权 详细点: 1、什么是JS渗透测试? 在JavaScript中也存在变量和函数,当存在可控变量及函数调用即可参数漏洞 2、流行的Js框架有哪些? …...
STM32——SPI
1.SPI简介 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚…...
【云安全】云上资产发现与信息收集
一、云基础设施组件 1、定义 在云计算基础架构中,基础设施组件通常包括:计算、存储、网络和安全等方面的资源。例如,计算资源可以是虚拟机、容器或无服务器计算引擎;存储资源可以是对象存储或块存储;网络资源可以是虚拟…...
flask搭建微服务器并训练CNN水果识别模型应用于网页
一. 搭建flask环境 概念 flask:一个轻量级 Web 应用框架,被设计为简单、灵活,能够快速启动一个 Web 项目。CNN:深度学习模型,用于处理具有网格状拓扑结构的数据,如图像(2D网格)和视频(3D网格&a…...
数据篇| 关于Selenium反爬杂谈
友情提示:本章节只做相关技术讨论, 爬虫触犯法律责任与作者无关。 LLM虽然如火如荼进行着, 但是没有数据支撑, 都是纸上谈兵, 人工智能的三辆马车:算法-数据-算力,缺一不可。之前写过关于LLM微调文章《微调入门篇:大模型微调的理论学习》、《微调实操一: 增量预训练(Pretrai…...
MySQL高阶1890-2020年最后一次登录
目录 题目 准备数据 分析数据 题目 编写解决方案以获取在 2020 年登录过的所有用户的本年度 最后一次 登录时间。结果集 不 包含 2020 年没有登录过的用户。 返回的结果集可以按 任意顺序 排列。 准备数据 Create table If Not Exists Logins (user_id int, time_stamp …...
update-alternatives官方手册
下述手册超链接都是英文,内容差不多,看一个就行 Debian系统的Ubuntu系统的《The Linux Programming Interface》图书上的...
cesium.js 入门到精通(5-2)
在cesium 的配置中 有一些参数 可以配置地图的显示 显示出 水的动态显示 山的效果 相当于一些动画显示的效果 var viewer new Cesium.Viewer("cesiumContainer", {infoBox: false,terrainProvider: await Cesium.createWorldTerrainAsync({requestWaterMask: tru…...
提升vue开发效率的秘诀,快马平台一键生成通用组件库
最近在重构公司的中后台管理系统时,发现很多重复性的工作占用了大量开发时间。经过实践总结,我发现通过合理封装通用组件和工具集,可以显著提升Vue3项目的开发效率。今天就来分享下我的实战经验。 通用表格组件的封装 这个组件基于Element Pl…...
GB28181国标协议实战:用WVP+ZLMediaKit搭建一个支持级联的轻量级视频中台
GB28181国标协议实战:构建轻量级视频中台的架构设计与实现 在安防监控与视频管理领域,GB28181协议已经成为设备互联互通的事实标准。对于需要整合多品牌设备、实现统一管理的技术团队而言,如何快速搭建一个稳定可靠的视频中台是项目落地的关键…...
2025届必备的AI学术方案实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下的学术写作情形里,免费的人工智能论文工具达成了从文献查找、大纲制作直至…...
终极Koikatu HF Patch配置指南:游戏体验全面升级方案
终极Koikatu HF Patch配置指南:游戏体验全面升级方案 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch Koikatu HF Patch作为非官方增强…...
Kubernetes与GitOps最佳实践
Kubernetes与GitOps最佳实践 1. GitOps概述 GitOps是一种基于Git的持续部署方法,它将基础设施和应用配置存储在Git仓库中,并通过自动化工具来实现部署。GitOps的核心原则是: Git作为单一事实来源:所有配置变更都通过Git进行版本控…...
BilibiliDown:基于Java的B站视频下载技术方案与实现解析
BilibiliDown:基于Java的B站视频下载技术方案与实现解析 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors…...
论文魔法盒:书匠策AI,期刊论文写作的“超级外挂”
在学术的奇妙世界里,论文写作就像是一场充满挑战的魔法冒险。尤其是期刊论文,它要求学者们不仅要有深厚的学术功底,还得掌握各种写作技巧和规范。不过,现在有了书匠策AI这个神奇的“魔法盒”,期刊论文写作不再是令人望…...
保姆级教程:用Python+Socket实现西门子CNC产量数据自动采集(附避坑指南)
PythonSocket实现西门子CNC产量数据自动化采集实战指南 在工业4.0时代,生产数据的实时采集与分析已成为智能制造的核心环节。对于使用西门子数控系统(如828D、840DSL等)的制造企业而言,如何绕过复杂的授权流程,通过编程…...
Awoo Installer:破解Switch游戏安装限制的高性能解决方案
Awoo Installer:破解Switch游戏安装限制的高性能解决方案 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer Awoo Installer是一款专为破解…...
m4s-converter:让B站缓存重获新生的轻量级格式转换工具
m4s-converter:让B站缓存重获新生的轻量级格式转换工具 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当你辛苦缓存的B站视频因下架…...
