Java 泛型深入解析
Java 中的泛型是一种强大的编程特性,允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面,包括泛型类、泛型方法、泛型接口以及泛型通配符。
1. 泛型类
首先,让我们看一个简单的泛型类的例子。在下面的代码中,我们定义了一个名为 GenericClass 的泛型类,它具有一个泛型参数 T,并包含了构造方法、获取数据的方法和设置数据的方法。
public class GenericClass<T> {private T data;// 构造方法public GenericClass(T data) {this.data = data;}// 获取数据的方法public T getData() {return data;}// 设置数据的方法public void setData(T data) {this.data = data;}
}
通过这个泛型类,我们可以创建具有不同类型的实例,例如:
// 使用泛型类,指定类型为String
GenericClass<String> stringGeneric = new GenericClass<>("Hello, Generics!");// 使用泛型类,指定类型为Integer
GenericClass<Integer> intGeneric = new GenericClass<>(42);
2. 泛型方法
泛型不仅限于类,还可以用于方法。下面的代码展示了一个包含泛型方法的类 MyGeneric,其中包括一个打印泛型类数据的方法。
public class MyGeneric {// 泛型方法public <T> void printData(GenericClass<T> generic) {System.out.println(generic.getData());}// 其他泛型方法和示例省略...
}
通过这个泛型方法,我们可以在不同的上下文中打印不同类型的数据,使得代码更加灵活。
3. 泛型接口
Java 还支持泛型接口,这使得我们可以定义接口时使用泛型参数。下面的代码展示了一个泛型接口 GenericInterface 及其实现类 StringContainer。
public interface GenericInterface<T> {T getData();void setData(T data);
}public class StringContainer implements GenericInterface<String> {private String data;@Overridepublic String getData() {return data;}@Overridepublic void setData(String data) {this.data = data;}
}
泛型接口提供了一种灵活的方式来定义可以处理多种类型数据的接口,并使得实现类更具通用性。
4. 泛型通配符
Java 的泛型还支持通配符,其中 <?> 表示未知类型。这种通配符的使用使得我们可以编写适用于多种泛型类型的代码。下面的代码展示了一个使用泛型通配符的方法。
public class MyGeneric {// 使用泛型通配符的方法,接受任意泛型类型的参数public static void printWildcardData(GenericClass<?> generic) {System.out.println("Wildcard data: " + generic.getData());}// 其他代码和示例省略...
}
通过这个方法,我们可以传递任意泛型类型的参数,提高了代码的灵活性。
5. 泛型 record 类
在 Java 14(? 目前使用的是 Java 17) 中引入的 record 类型也支持泛型。下面的代码展示了一个泛型 record 类 Pair。
public record Pair<T>(T first, T second) {// 这里没有额外的方法,因为 record 自动生成了构造方法、getter 方法等
}
record 类提供了一种简洁的方式来定义不可变类,并通过泛型支持处理不同类型的数据。
6、完整代码

package com.lfsun.generic;// 定义一个泛型类
public class GenericClass<T> {private T data;// 构造方法public GenericClass(T data) {this.data = data;}// 获取数据的方法public T getData() {return data;}// 设置数据的方法public void setData(T data) {this.data = data;}
}
package com.lfsun.generic;// 定义一个泛型接口
public interface GenericInterface<T> {T getData();void setData(T data);
}
package com.lfsun.generic;// 定义一个泛型 record 类
public record Pair<T>(T first, T second) {// 这里没有额外的方法,因为 record 自动生成了构造方法、getter 方法等
}
package com.lfsun.generic;// 实现泛型接口的类
public class StringContainer implements GenericInterface<String> {private String data;@Overridepublic String getData() {return data;}@Overridepublic void setData(String data) {this.data = data;}
}
package com.lfsun.generic;// 定义一个包含泛型方法的类
public class MyGeneric {// 泛型方法public <T> void printData(GenericClass<T> generic) {System.out.println(generic.getData());}// 泛型方法示例,接受任意类型的数组并打印public static <E> void printArray(E[] array) {for (E element : array) {System.out.print(element + " ");}System.out.println();}// 使用泛型通配符的方法,接受任意泛型类型的参数public static void printWildcardData(GenericClass<?> generic) {System.out.println("Wildcard data: " + generic.getData());}public static void main(String[] args) {// 使用泛型类,指定类型为StringGenericClass<String> stringGeneric = new GenericClass<>("Hello, Generics!");// 使用泛型方法,打印泛型类的数据MyGeneric myGeneric = new MyGeneric();myGeneric.printData(stringGeneric);// 使用泛型接口,实现类存储String类型数据StringContainer stringContainer = new StringContainer();stringContainer.setData("Generic Interface Example");System.out.println("Data from interface: " + stringContainer.getData());// 使用泛型方法,打印任意类型的数组Integer[] intArray = {1, 2, 3, 4, 5};String[] stringArray = {"apple", "banana", "orange"};printArray(intArray);printArray(stringArray);// 使用泛型通配符的方法,打印任意泛型类型的数据GenericClass<Double> doubleGeneric = new GenericClass<>(3.14);printWildcardData(doubleGeneric);// 创建 Pair 实例,指定泛型类型为 StringPair<String> stringPair = new Pair<>("Hello", "World");// 访问 record 自动生成的 getter 方法System.out.println("First: " + stringPair.first());System.out.println("Second: " + stringPair.second());}
}相关文章:
Java 泛型深入解析
Java 中的泛型是一种强大的编程特性,允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面,包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先,让我们看一个简单的泛型类的例子。在下面的代码中&a…...
Apache Doris (六十): Doris - 物化视图
🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录...
【javaweb】tomcat9.0中的HttpServlet
2023年12月28日,周四晚上 目录 什么是HttpServlet tomcat中的HttpServlet由谁产生 什么是HttpServlet 在Tomcat中,HttpServlet 是 Java Servlet API 中的一个抽象类,用于简化基于HTTP协议的Servlet的开发。HttpServlet 扩展了 GenericServ…...
数据结构学习笔记——查找算法中的树形查找(B树、B+树)
目录 前言一、B树(一)B树的概念(二)B树的性质(三)B树的高度(四)B树的查找(五)B树的插入(六)B树的删除 二、B树(一…...
python包chromadb安装失败总结
1,背景: 最近在学习langchain的课程,里面创建自己的知识库的Retrieval模块中,需要用到向量数据库。 所以按照官方的教程(vectorstores),准备使用chroma的向量数据库。图片来源 2,问…...
机器学习(四) -- 模型评估(2)
系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 机器学习(四) -- 模型评估…...
泊松分布与二项分布的可加性
泊松分布与二项分布的可加性 泊松分布的可加性 例 : 设 X , Y X,Y X,Y 相互独立 , X ∼ P ( λ 1 ) X\sim P(\lambda_1) X∼P(λ1) , Y ∼ P ( λ 2 ) Y\sim P(\lambda_2) Y∼P(λ2) , 求证 Z X Y ZXY ZXY 服从参数为 λ 1 λ 2 \lambda_1 \lambda_2 λ1λ2 …...
【PostgreSQL】约束-排他约束
【PostgreSQL】约束链接 检查 唯一 主键 外键 排他 排他约束 排他约束是一种数据库约束,用于确保某一列或多个列中的值在每一条记录中都是唯一的。这意味着任何两条记录都不能具有相同的值。 排他约束可以在数据库中创建唯一索引或唯一约束来实现。当尝试插入或更…...
Java重修第一天—学习数组
1. 认识数组 建议1.5倍速学习,并且关闭弹幕。 数组的定义:数组是一个容器,用来存储一批同种类型的数据。 下述图:是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢?为了解决在某些场景下,变…...
【C#】知识点实践序列之Lock的锁定代码块
大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章,此篇文章是C#知识点实践序列之Lock知识点,博主能力有限,理解水平有限,若有不对之处望指正! 本篇验证Lock锁定代…...
StringBad ditto (motto)
第12章 类和动态内存分配 StringBad ditto (motto): // calls StringBad (comst StringBad &) StringBad metoo - motto: // calls StringBad (const StringBad &) StringBad also StringBad (motto): // calls StringBad (const StringBad &) StringBad * pStri…...
Redis缓存击穿、缓存雪崩、缓存穿透
缓存击穿(某个热点key缓存失效) 概念 缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大和缓存雪崩的…...
【PCB专题】Allegro封装更新焊盘
在PCB封装的绘制中,有时会出现需要更新焊盘的情况。比如在制作封装的过程中发现焊盘做的不对而使用PAD_Designer重新更新了焊盘。 那在PCB中如何更新已经修改过的焊盘呢? 打开封装,选择Tools->Padstack->Refresh... 选择Refresh all …...
ES6之Reflect详解
✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…...
文件监控-IT安全管理软件
文件监控和IT安全管理软件是用于保护企业数据和网络安全的工具。这些工具可以帮助企业监控文件的变化,防止未经授权的访问和修改,并确保数据的安全性和完整性。 一、具有哪些功能 文件监控软件可以实时监控文件系统的活动,包括文件的创建、修…...
达梦数据库安装超详细教程(小白篇)
文章目录 达梦数据库一、达梦数据库简介二、达梦数据库下载三、达梦数据库安装1. 解压2. 安装 四、初始化数据库五、DM管理工具 达梦数据库 一、达梦数据库简介 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。 达梦数…...
复试 || 就业day09(2024.01.04)算法篇
文章目录 前言验证外星语词典在长度 2N 的数组中找出重复 N 次的元素找到小镇的法官查找共用字符数组的相对排序分发饼干分发糖果区间选点(AcWing)最大不相交区间数量(AcWing)无重叠区间关于重写小于号 前言 💫你好,我是辰chen,本文旨在准备考…...
Win10电脑关闭OneDrive自动同步的方法
在Win10电脑操作过程中,用户想要关闭OneDrive的自动同步功能,但不知道具体要怎么操作?首先用户需要打开OneDrive,然后点击关闭默认情况下将文档保存到OneDrive选项保存,最后关闭在这台电脑上同步设置保存就好了。接下来…...
linux(centos)相关
文件架构: bin--binary--二进制命令,可直接执行 sbin systembin系统二进制命令,超级管理员 lib 库目录 类似dll文件 lib64 64位系统相关的库文件 usr 用户文件 boot 引导分区的文件,链接,系统启动等 dev device设备目录…...
外贸网站显示不安全警告怎么办?消除网站不安全警告超全指南
外贸网站显示不安全警告怎么办?当用户访问你的网站,而您的网站没有部署SSL证书实现HTTPS加密时,网站就会显示不安全警告,这种警告,不仅有可能阻止用户继续浏览网站,影响网站声誉,还有可能影响网…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
