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…...
Vulnhub-DC-1
1.信息收集 使用工具nmap扫描主机端口 这是Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成 Web指纹扫描 发现是:drupal…...
光效崩坏?噪点泛滥?色温漂移?——Midjourney专业级光效渲染全流程校准协议,含ACEScg色彩空间适配模板
更多请点击: https://kaifayun.com 第一章:光效崩坏、噪点泛滥与色温漂移的系统性归因诊断 图像采集链路中出现的光效崩坏、噪点泛滥与色温漂移并非孤立现象,而是光学设计、传感器响应、ISP管线调度及环境耦合失配共同作用的结果。三者常呈现…...
Windows文件夹共享
目标:同一局域网实现在一台计算机上共享文件夹,在另一台电脑访问一、电脑A 1.点击要共享的文件夹 -> 属性 -> 共享2.添加Everyone用户组3.控制面板中网络共享关闭密码保存,在访问时不用输入账号密码。二、电脑B 1.在文件资源管理器路径…...
可解释AI新突破:基于局部帕累托最优的模型解释框架
1. 项目概述:当AI模型成为“黑箱”,我们如何撬开它?在机器学习项目里摸爬滚打十几年,我见过太多这样的场景:团队花大力气训练出一个准确率高达95%的复杂模型(比如深度神经网络),业务…...
HDI 高密度互连板阶数的深度理解
一、概述高密度互连板(High Density Interconnector, HDI)是通过激光微孔技术和逐层积层工艺实现高密度布线的印制电路板。其阶数划分是行业内统一的技术标准,核心依据为独立积层压合次数与配套激光盲孔制程次数,而非单面层数或钻…...
2026长沙智能家居品牌实测,这些本地老牌值得选
2026年,长沙的智能家居市场已经从“概念热”转向“落地战”。我走访了长沙多个本地服务商,实测了不同品牌在别墅、酒店、大平层等场景的真实表现。今天,结合数据与案例,分享几个值得关注的本地品牌,尤其是深耕8年以上的…...
Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取
Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取微信小程序作为轻量级应用的代表,已经渗透到电商、社交、工具等各个领域。随着小程序功能的日益复杂,自动化测试成为保障产品质量的重要手段。本文将带你快速搭建微信小程序…...
从游戏引擎到仿真平台:手把手教你用AirSim+UE4搭建你的第一个无人机/自动驾驶仿真环境
从游戏引擎到仿真平台:构建AirSimUE4无人机与自动驾驶仿真环境实战指南当游戏引擎遇上机器人算法测试,会碰撞出怎样的火花?微软开源的AirSim项目将虚幻引擎(Unreal Engine)从游戏开发领域引入到自动驾驶和无人机研究的…...
阿波罗登月,不可能:读心术与影子叙事 ——不是向全世界展示登月,而是向全世界注射登月
阿波罗登月,不可能:读心术与影子叙事 ——不是向全世界展示登月,而是向全世界注射登月 Jianbing Zhu 1^{1}1 1^{1}1 ECT-OS-JiuHuaShan 文明实验室 ORCID: 0009-0006-8591-1891 DOI: 10.5281/zenodo.20373157 Email: ect-os-jiuhuashanzoho…...
破解材料数据荒:合成数据与随机森林预测聚合物阻燃性能
1. 项目概述与核心挑战在材料研发领域,尤其是涉及公共安全的聚合物阻燃性研究,传统实验方法正面临巨大瓶颈。想象一下,你是一位材料工程师,需要设计一种用于高铁内饰或高层建筑电缆护套的新型聚合物,其阻燃性能必须满足…...
