当前位置: 首页 > news >正文

java泛型类与泛型方法

Java泛型类和泛型方法是Java泛型编程中的重要组成部分。它们允许开发者编写类型安全且高度复用的代码。下面详细介绍泛型类和泛型方法的概念、用法和示例。

泛型类

泛型类是在类定义中使用类型参数的类,可以指定具体的类型实例化该类。这样可以确保类型安全,并且提高代码的复用性。

声明泛型类

泛型类的声明格式如下:

1public class ClassName<TypeParameters> {
2    // 类成员
3}

其中,TypeParameters是一个或多个类型参数的列表,用逗号分隔。类型参数通常使用大写字母表示,如TEKV等。

示例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,使用类型通配符?

泛型的限制

虽然泛型提供了类型安全和代码复用的优点,但也有一些限制:

  1. 类型擦除:泛型类型在编译时进行类型检查,但在运行时会被擦除成对应的原始类型。
  2. 通配符限制:使用类型通配符时需要注意限制条件,避免类型错误。
  3. 强制类型转换:尽管使用泛型可以减少强制类型转换,但在某些情况下仍然需要显式的类型转换。

总结

Java泛型类和泛型方法是Java泛型编程的重要组成部分。它们允许开发者编写类型安全且高度复用的代码。通过使用泛型类和泛型方法,可以显著提高代码的可读性和可维护性。掌握这些基本概念和用法后,可以进一步探索更高级的泛型特性,如泛型通配符、边界类型等,以实现更加复杂的类型安全需求。

相关文章:

java泛型类与泛型方法

Java泛型类和泛型方法是Java泛型编程中的重要组成部分。它们允许开发者编写类型安全且高度复用的代码。下面详细介绍泛型类和泛型方法的概念、用法和示例。 泛型类 泛型类是在类定义中使用类型参数的类&#xff0c;可以指定具体的类型实例化该类。这样可以确保类型安全&#…...

Android String资源文件中,空格、换行以及特殊字符如何表示

空格&#xff1a; 例&#xff1a;<string name"test">test test</string> 换行&#xff1a;\n 例&#xff1a;<string name"test">test \n test</string> tab&#xff1a;\t …...

CUDA及GPU学习资源汇总

CUDA C Programming Guide 的中文翻译版GPU中的SM和warp的关系推荐几个不错的CUDA入门教程CUDA编程入门极简教程...

uniapp vue3 梯形选项卡组件

实现的效果图&#xff1a; 切换选项卡显示不同的内容&#xff0c;把这个选项卡做成了一个组件&#xff0c;需要的自取。 // 组件名为 trapezoidalTab <template> <view class"pd24"><view class"nav"><!-- 左侧 --><view cla…...

如何在微信小程序中实现WebSocket连接

微信小程序作为一种全新的应用形态&#xff0c;凭借其便捷性、易用性受到了广大用户的喜爱。在实际开发过程中&#xff0c;实时通信功能是很多小程序必备的需求。WebSocket作为一种在单个TCP连接上进行全双工通信的协议&#xff0c;能够实现客户端与服务器之间的实时通信。本文…...

二级等保测评中安全物理环境的重要性及高危项分析

当今数字化时代&#xff0c;信息安全至关重要。网络安全等级保护测评是确保信息系统安全稳定运行的重要手段之一&#xff0c;其中二级等保测评对于许多企业和组织来说是必须要达到的安全标准。 而安全物理环境作为等保测评的重要组成部分&#xff0c;其重要性不容忽视。 安全物…...

C++11——lambda

lambda lambda的介绍lambda的使用lambda的细节->捕捉列表 lambda的介绍 lambda是匿名函数&#xff0c;再适合的场景去使用可以提高代码的可读性。 场景&#xff1a; 假设有一个Goods类需要进行按照价格、数量排序 class Goods {string name;size_t _price;//价格int num;/…...

Dubbo3序列化安全问题

序列化安全 在 Dubbo 3.0 中&#xff0c;序列化协议的安全性得到了加强。 1. 序列化安全性升级 Triple 协议: 推荐使用 Triple 协议 的非 Wrapper 模式&#xff0c;该模式在安全性上更为严格。需要开发人员编写 IDL&#xff08;接口描述语言&#xff09;文件&#xff0c;这虽…...

秒懂Linux之共享内存

目录 共享内存概念 模拟实现共享内存 创建key阶段 ​编辑创建共享内存阶段 删除共享内存阶段 查看共享内存属性阶段 挂接共享内存到进程阶段 取消共享内存与进程挂接阶段 进程通信阶段 添加管道改进版 共享内存函数 shmget函数 shmat函数 shmdt函数 shmctl函数 共享内存概念 共…...

【计算机网络】网络层协议解析

网络层的两种服务IPv4分类编址划分子网无分类地址 IPv4地址应用IP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报 IPv4数据报首部格式ICMP网际控制报文协议虚拟专用网VPN与网络地址转换NAT 网络层主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传…...

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 线程局部存储&#xff0c;简称TLS。 为什么需要Thread Local Storage 变量分为全…...

WEB攻防-JS项目Node.js框架安全识别审计验证绕过

知识点&#xff1a; 1、原生JS&开发框架-安全条件 2、常见安全问题-前端验证&未授权 详细点&#xff1a; 1、什么是JS渗透测试&#xff1f; 在JavaScript中也存在变量和函数&#xff0c;当存在可控变量及函数调用即可参数漏洞 2、流行的Js框架有哪些&#xff1f; …...

STM32——SPI

1.SPI简介 SPI&#xff0c;是英语Serial Peripheral Interface的缩写&#xff0c;顾名思义就是串行外围设备接口。SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xf…...

【云安全】云上资产发现与信息收集

一、云基础设施组件 1、定义 在云计算基础架构中&#xff0c;基础设施组件通常包括&#xff1a;计算、存储、网络和安全等方面的资源。例如&#xff0c;计算资源可以是虚拟机、容器或无服务器计算引擎&#xff1b;存储资源可以是对象存储或块存储&#xff1b;网络资源可以是虚拟…...

flask搭建微服务器并训练CNN水果识别模型应用于网页

一. 搭建flask环境 概念 flask:一个轻量级 Web 应用框架&#xff0c;被设计为简单、灵活&#xff0c;能够快速启动一个 Web 项目。CNN:深度学习模型&#xff0c;用于处理具有网格状拓扑结构的数据&#xff0c;如图像&#xff08;2D网格&#xff09;和视频&#xff08;3D网格&a…...

数据篇| 关于Selenium反爬杂谈

友情提示:本章节只做相关技术讨论, 爬虫触犯法律责任与作者无关。 LLM虽然如火如荼进行着, 但是没有数据支撑, 都是纸上谈兵, 人工智能的三辆马车:算法-数据-算力,缺一不可。之前写过关于LLM微调文章《微调入门篇:大模型微调的理论学习》、《微调实操一: 增量预训练(Pretrai…...

MySQL高阶1890-2020年最后一次登录

目录 题目 准备数据 分析数据 题目 编写解决方案以获取在 2020 年登录过的所有用户的本年度 最后一次 登录时间。结果集 不 包含 2020 年没有登录过的用户。 返回的结果集可以按 任意顺序 排列。 准备数据 Create table If Not Exists Logins (user_id int, time_stamp …...

update-alternatives官方手册

下述手册超链接都是英文&#xff0c;内容差不多&#xff0c;看一个就行 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…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...