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

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 中的泛型是一种强大的编程特性&#xff0c;允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面&#xff0c;包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先&#xff0c;让我们看一个简单的泛型类的例子。在下面的代码中&a…...

Apache Doris (六十): Doris - 物化视图

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录...

【javaweb】tomcat9.0中的HttpServlet

2023年12月28日&#xff0c;周四晚上 目录 什么是HttpServlet tomcat中的HttpServlet由谁产生 什么是HttpServlet 在Tomcat中&#xff0c;HttpServlet 是 Java Servlet API 中的一个抽象类&#xff0c;用于简化基于HTTP协议的Servlet的开发。HttpServlet 扩展了 GenericServ…...

数据结构学习笔记——查找算法中的树形查找(B树、B+树)

目录 前言一、B树&#xff08;一&#xff09;B树的概念&#xff08;二&#xff09;B树的性质&#xff08;三&#xff09;B树的高度&#xff08;四&#xff09;B树的查找&#xff08;五&#xff09;B树的插入&#xff08;六&#xff09;B树的删除 二、B树&#xff08;一&#xf…...

python包chromadb安装失败总结

1&#xff0c;背景&#xff1a; 最近在学习langchain的课程&#xff0c;里面创建自己的知识库的Retrieval模块中&#xff0c;需要用到向量数据库。 所以按照官方的教程&#xff08;vectorstores&#xff09;&#xff0c;准备使用chroma的向量数据库。图片来源 2&#xff0c;问…...

机器学习(四) -- 模型评估(2)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…...

泊松分布与二项分布的可加性

泊松分布与二项分布的可加性 泊松分布的可加性 例 : 设 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】约束链接 检查 唯一 主键 外键 排他 排他约束 排他约束是一种数据库约束&#xff0c;用于确保某一列或多个列中的值在每一条记录中都是唯一的。这意味着任何两条记录都不能具有相同的值。 排他约束可以在数据库中创建唯一索引或唯一约束来实现。当尝试插入或更…...

Java重修第一天—学习数组

1. 认识数组 建议1.5倍速学习&#xff0c;并且关闭弹幕。 数组的定义&#xff1a;数组是一个容器&#xff0c;用来存储一批同种类型的数据。 下述图&#xff1a;是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢&#xff1f;为了解决在某些场景下&#xff0c;变…...

【C#】知识点实践序列之Lock的锁定代码块

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇验证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缓存击穿、缓存雪崩、缓存穿透

缓存击穿&#xff08;某个热点key缓存失效&#xff09; 概念 缓存中没有但数据库中有的数据&#xff0c;假如是热点数据&#xff0c;那key在缓存过期的一刻&#xff0c;同时有大量的请求&#xff0c;这些请求都会击穿到DB&#xff0c;造成瞬时DB请求量大、压力增大和缓存雪崩的…...

【PCB专题】Allegro封装更新焊盘

在PCB封装的绘制中&#xff0c;有时会出现需要更新焊盘的情况。比如在制作封装的过程中发现焊盘做的不对而使用PAD_Designer重新更新了焊盘。 那在PCB中如何更新已经修改过的焊盘呢&#xff1f; 打开封装&#xff0c;选择Tools->Padstack->Refresh... 选择Refresh all …...

ES6之Reflect详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…...

文件监控-IT安全管理软件

文件监控和IT安全管理软件是用于保护企业数据和网络安全的工具。这些工具可以帮助企业监控文件的变化&#xff0c;防止未经授权的访问和修改&#xff0c;并确保数据的安全性和完整性。 一、具有哪些功能 文件监控软件可以实时监控文件系统的活动&#xff0c;包括文件的创建、修…...

达梦数据库安装超详细教程(小白篇)

文章目录 达梦数据库一、达梦数据库简介二、达梦数据库下载三、达梦数据库安装1. 解压2. 安装 四、初始化数据库五、DM管理工具 达梦数据库 一、达梦数据库简介 ​ 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统&#xff0c;简称DM。 达梦数…...

复试 || 就业day09(2024.01.04)算法篇

文章目录 前言验证外星语词典在长度 2N 的数组中找出重复 N 次的元素找到小镇的法官查找共用字符数组的相对排序分发饼干分发糖果区间选点(AcWing)最大不相交区间数量(AcWing)无重叠区间关于重写小于号 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考…...

Win10电脑关闭OneDrive自动同步的方法

在Win10电脑操作过程中&#xff0c;用户想要关闭OneDrive的自动同步功能&#xff0c;但不知道具体要怎么操作&#xff1f;首先用户需要打开OneDrive&#xff0c;然后点击关闭默认情况下将文档保存到OneDrive选项保存&#xff0c;最后关闭在这台电脑上同步设置保存就好了。接下来…...

linux(centos)相关

文件架构&#xff1a; bin--binary--二进制命令&#xff0c;可直接执行 sbin systembin系统二进制命令&#xff0c;超级管理员 lib 库目录 类似dll文件 lib64 64位系统相关的库文件 usr 用户文件 boot 引导分区的文件&#xff0c;链接&#xff0c;系统启动等 dev device设备目录…...

外贸网站显示不安全警告怎么办?消除网站不安全警告超全指南

外贸网站显示不安全警告怎么办&#xff1f;当用户访问你的网站&#xff0c;而您的网站没有部署SSL证书实现HTTPS加密时&#xff0c;网站就会显示不安全警告&#xff0c;这种警告&#xff0c;不仅有可能阻止用户继续浏览网站&#xff0c;影响网站声誉&#xff0c;还有可能影响网…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...