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

Java 泛型的用法

1. 泛型类

泛型类是指在类定义时使用类型参数来指定类的类型。这样可以在类的内部使用这些类型参数来定义字段、方法的返回类型和参数类型。

public class Box<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}
}

在这个例子中,Box 类使用了一个类型参数 T,可以在创建 Box 对象时指定具体的类型。

Box<Integer> integerBox = new Box<>();
integerBox.set(10);
Integer value = integerBox.get();Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String message = stringBox.get();

2. 泛型接口

泛型接口与泛型类类似,允许在接口定义时使用类型参数。

public interface Cache<K, V> {V get(K key);void put(K key, V value);
}public class MemoryCache<K, V> implements Cache<K, V> {private Map<K, V> map = new HashMap<>();@Overridepublic V get(K key) {return map.get(key);}@Overridepublic void put(K key, V value) {map.put(key, value);}
}

在这个例子中,Cache 接口使用了两个类型参数 K 和 V,分别表示键和值的类型。MemoryCache 类实现了 Cache 接口,并使用了这些类型参数。

Cache<String, Integer> cache = new MemoryCache<>();
cache.put("one", 1);
Integer number = cache.get("one");

3. 泛型方法

泛型方法是指在方法定义时使用类型参数。这样可以在方法内部使用这些类型参数来定义方法的返回类型和参数类型。

public class Util {public static <T> T getFirst(T[] array) {if (array == null || array.length == 0) {return null;}return array[0];}
}

在这个例子中,getFirst 方法使用了一个类型参数 T,可以在调用方法时指定具体的类型。

Integer[] intArray = {1, 2, 3};
Integer firstInt = Util.getFirst(intArray);String[] stringArray = {"Hello", "World"};
String firstString = Util.getFirst(stringArray);

4. 类型通配符

类型通配符 ? 用于表示未知类型,可以用于方法参数和返回类型,以提高代码的灵活性。

无界通配符:? 表示任意类型。
public void printList(List<?> list) {for (Object elem : list) {System.out.print(elem + " ");}System.out.println();
}

}

有界通配符:

上界通配符:? extends T 表示类型参数是 T 的子类型。
public static double sumOfList(List<? extends Number> list) {double s = 0.0;for (Number n : list) {s += n.doubleValue();}return s;
}

下界通配符:? super T 表示类型参数是 T 的父类型。

public static void addNumbers(List<? super Integer> list) {for (int i = 1; i <= 10; i++) {list.add(i);}
}

5. 泛型的类型擦除

Java 泛型在编译时会被擦除,即编译后的字节码中不包含泛型信息。这意味着在运行时,泛型类型参数会被替换为它们的上界(如果有上界)或 Object(如果没有上界)。

public class Box<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}
}

编译后,Box 类的字节码中 T 会被替换为 Object:

public class Box {private Object t;public void set(Object t) {this.t = t;}public Object get() {return t;}
}

6. 泛型的限制

不能使用基本数据类型:泛型只能使用对象类型,不能使用基本数据类型。例如,不能创建 Box,但可以创建 Box。
类型参数不能是 final 类型:不能使用 final 类型作为类型参数。
静态上下文中不能使用类型参数:不能在静态方法或静态初始化块中使用类的类型参数。
类型参数不能是异常类型:不能使用异常类型作为类型参数。

相关文章:

Java 泛型的用法

1. 泛型类 泛型类是指在类定义时使用类型参数来指定类的类型。这样可以在类的内部使用这些类型参数来定义字段、方法的返回类型和参数类型。 public class Box<T> {private T t;public void set(T t) {this.t t;}public T get() {return t;} }在这个例子中&#xff0c…...

人工智能与物联网:智慧城市的未来

引言 清晨6点&#xff0c;智能闹钟根据你的睡眠状态和天气情况&#xff0c;自动调整叫醒时间&#xff1b;窗帘缓缓打开&#xff0c;阳光洒满房间&#xff1b;厨房里的咖啡机已经为你准备好热饮&#xff0c;而无人驾驶公交车正按时抵达楼下站点。这不是科幻电影的场景&#xff…...

Python标准库之SQLite3

包含了连接数据库、处理数据、控制数据、自定义输出格式及处理异常的各种方法。 官方文档&#xff1a;sqlite3 --- SQLite 数据库的 DB-API 2.0 接口 — Python 3.13.1 文档 官方文档SQLite对应版本&#xff1a;3.13.1 SQLite主页&#xff1a;SQLite Home Page SQL语法教程&a…...

力扣 二叉树的最大深度

树的遍历&#xff0c;dfs与bfs基础。 题目 注意这种题要看根节点的深度是0还是1。 深度优先遍历dfs&#xff0c;通过递归分别计算左子树和右子树的深度&#xff0c;然后返回左右子树深度的最大值再加上 1。递归会一直向下遍历树&#xff0c;直到达到叶子节点或空节点。在回溯…...

Linux_进程间通信_共享内存

什么是共享内存&#xff1f; 对于两个进程&#xff0c;通过在内存开辟一块空间&#xff08;操作系统开辟的&#xff09;&#xff0c;进程的虚拟地址通过页表映射到对应的共享内存空间中&#xff0c;进而实现通信&#xff1b;物理内存中的这块空间&#xff0c;就叫做共享内存。…...

ubuntu 下生成 core dump

在Ubuntu下,发现程序崩溃后不生成core dump文件, 即使设置了ulimit -c unlimited后仍然无效。 1.ulimit -c unlimited 输出的的含义是核心转储文件的大小限制,单位是blocks,默认是0,表示不生成core dump文件。 2. 重设core_pattern ulimit -c unlimited后,核心转储文件…...

学习HLS.js

前言 HTTP 实时流&#xff08;也称为HLS&#xff08;.m3u8&#xff09;&#xff09;是一种基于HTTP的自适应比特率流通信协议。HLS.js依靠HTML5视频和MediaSource Extensions进行播放&#xff0c;其特点&#xff1a;视频点播和直播播放列表、碎片化的 MP4 容器、加密媒体扩展 …...

2025年华为OD上机考试真题(Java)——判断输入考勤信息能否获得出勤奖

题目&#xff1a; 公司用一个字符串来表示员工的出勤信息&#xff1a; absent&#xff1a;缺勤late&#xff1a;迟到leaveearly&#xff1a;早退present&#xff1a;正常上班 现需根据员工出勤信息&#xff0c;判断本次是否能获得出勤奖&#xff0c;能获得出勤奖的条件如下&am…...

空对象模式

在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值&#xff0c;而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中&#xff0c;我…...

开启Excel导航仪,跨表跳转不迷路-Excel易用宝

都2025年了&#xff0c;汽车都有导航了&#xff0c;你的表格还没有导航仪吗&#xff1f;那也太OUT了。 面对着一个工作簿中有N多个工作表&#xff0c;工作表中又有超级表&#xff0c;数据透视表&#xff0c;图表等元素&#xff0c;如何快速的切换跳转到需要查看的数据呢&#…...

年度技术突破奖|中兴微电子引领汽车芯片新变革

随着以中央计算区域控制为代表的新一代整车电子架构逐步成为行业主流&#xff0c;车企在电动化与智能化之后&#xff0c;正迎来以架构创新为核心的新一轮技术竞争。中央计算SoC&#xff0c;作为支撑智驾和智舱高算力需求的核心组件&#xff0c;已成为汽车电子市场的重要新增量。…...

Ubuntu 如何查看盘是机械盘还是固态盘

在 Ubuntu 系统中&#xff0c;您可以通过以下方法来确定硬盘是机械硬盘&#xff08;HDD&#xff09;还是固态硬盘&#xff08;SSD&#xff09;&#xff1a; 使用 lsblk 命令&#xff1a; 打开终端&#xff0c;输入以下命令&#xff1a; lsblk -d -o name,rota该命令将列出所…...

计算机网络(三)——局域网和广域网

一、局域网 特点&#xff1a;覆盖较小的地理范围&#xff1b;具有较低的时延和误码率&#xff1b;使用双绞线、同轴电缆、光纤传输&#xff0c;传输效率高&#xff1b;局域网内各节点之间采用以帧为单位的数据传输&#xff1b;支持单播、广播和多播&#xff08;单播指点对点通信…...

STM32F4分别驱动SN65HVD230和TJA1050进行CAN通信

目录 一、CAN、SN65HVD230DR二、TJA10501、TJA1050 特性2、TJA1050 引脚说明 三、硬件设计1、接线说明2、TJA1050 模块3、SN65HVD230 模块 四、程序设计1、CAN_Init&#xff1a;CAN 外设初始化函数2、CAN_Send_Msg、CAN_Receive_Msg 五、功能展示1、接线图2、CAN 数据收发测试 …...

将光源视角的深度贴图应用于摄像机视角的渲染

将光源视角的深度贴图应用于摄像机视角的渲染是阴影映射&#xff08;Shadow Mapping&#xff09;技术的核心步骤之一。这个过程涉及到将摄像机视角下的片段坐标转换到光源视角下&#xff0c;并使用深度贴图来判断这些片段是否处于阴影中。 1. 生成光源视角的深度贴图 首先&…...

docker一键安装脚本(docker安装)

第一种方法一键安装命令 curl -O --url http://luyuanbo79.south.takin.cc/wenjian/docker_install.sh && chmod x docker_install.sh && ./docker_install.sh 备用方法 curl -O --url https://file.gitcode.com/4555247/releases/untagger_0896d4789937405…...

【SY2】Apollo10.0 Cyber基于Writer/Reader的通信方式

实验前提 Apollo10.0已经安装完毕Vscode及相关插件安装完成启动容器并进入在Vscode连接进入到Apollo工作空间下学习资料 部分配置如实验一https://blog.csdn.net/weixin_60062799/article/details/145029669?spm1001.2014.3001.5501 学习资料 Apollo7.0或其他版本可以参…...

【YOLOv8杂草作物目标检测】

YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结&#xff1a; 农作物幼苗与杂草检测系统&#xff1a;基于YOLOv8深度学习框架&#xff0c;通过2822张图片训练了一个目标检测模型&#xff…...

在Java中实现集合排序

使用字面量的方式创建一个集合 //使用字面量的方式初始化一个List集合List<User> userList Arrays.asList(new User("小A",5),new User("小鑫",18),new User("小昌",8),new User("小鑫",8));注意&#xff1a;使用Arrays.asLis…...

el-descriptions-item使用span占行不生效

需要实现的效果是客户状态单独占满一行 错误代码&#xff1a; <el-descriptions title"基本信息" :column"3"> <el-descriptions-item label"公司电话:">Suzhou</el-descriptions-item><el-descriptions-item label"…...

HoRain云--Bootstrap5图像形状全攻略

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...

VLA学习笔记——持续更新中

5 VLA - Vision-Language-Action 大模型 Vision-Language-Action(视觉 - 语言 - 动作) 大模型是之后 多模态 AI 以及机器人发展的一个非常重要的方向&#xff0c;有了 VLA 这位大神的加持&#xff0c;机器人可以完成由环境感知到动作应对的智能任务。 欢迎大家star! Paper: O…...

Jetson Orin Nano系统降级实战:从Ubuntu 22.04回退至20.04的避坑指南

1. 为什么需要从Ubuntu 22.04降级到20.04&#xff1f; 最近很多使用Jetson Orin Nano开发板的开发者都遇到了一个棘手的问题&#xff1a;Ubuntu 22.04的软件生态兼容性。我自己在实际项目中就踩过这个坑&#xff0c;当时为了追求新版本的系统性能&#xff0c;直接安装了Ubuntu …...

JetBrains IDE试用期管理完全指南:从技术原理到合规使用

JetBrains IDE试用期管理完全指南&#xff1a;从技术原理到合规使用 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 一、问题导入&#xff1a;当试用期结束打断开发流程时 1.1 开发中断的典型场景 想象这样一个…...

GLM-4.1V-9B-Base实战教程:批量图片队列处理与异步结果回调机制实现

GLM-4.1V-9B-Base实战教程&#xff1a;批量图片队列处理与异步结果回调机制实现 1. 引言 在实际业务场景中&#xff0c;我们经常需要处理大量图片的分析任务。GLM-4.1V-9B-Base作为一款强大的视觉多模态理解模型&#xff0c;虽然提供了便捷的Web界面&#xff0c;但面对批量图…...

Python AOT编译成本控制实战:2026年前必须掌握的7项硬核降本技术(含CPython 3.15+原生支持验证数据)

第一章&#xff1a;Python AOT编译成本控制的战略定位与2026技术拐点Python长期以来以解释执行和动态特性见长&#xff0c;但其运行时开销与启动延迟在云原生边缘计算、实时AI推理及嵌入式服务场景中日益成为瓶颈。AOT&#xff08;Ahead-of-Time&#xff09;编译正从实验性探索…...

OpenClaw自动化周报生成:Qwen2.5-VL-7B图文混合排版实战

OpenClaw自动化周报生成&#xff1a;Qwen2.5-VL-7B图文混合排版实战 1. 为什么需要自动化周报 每周五下午3点&#xff0c;我的日历总会准时弹出"写周报"的提醒。作为一个小团队的Tech Lead&#xff0c;我需要汇总Jira任务进展、Git代码提交、会议纪要等零散信息&am…...

基于深度学习的文本情感分析改进模型实验方案

基于深度学习的文本情感分析改进模型实验方案 一、实验背景与目的 1.1 背景 情感分析是自然语言处理的核心任务之一,旨在自动识别文本所表达的情感倾向(如正面、负面)。传统机器学习方法依赖人工特征工程,而深度学习方法能够自动学习文本的层次化特征表示。然而,现有模…...

Linux who命令实现:文件读写与系统编程实践

1. 从零实现Linux who命令&#xff1a;深入理解文件读写与系统编程作为一个常年与Linux打交道的开发者&#xff0c;我始终认为理解系统命令的实现原理是提升编程能力的最佳途径。今天我们就来解剖who这个看似简单却内涵丰富的命令&#xff0c;通过亲手实现它来掌握Linux文件操作…...

嵌入式开发中静态代码扫描的必要性与实践

1. 为什么嵌入式开发需要静态代码扫描&#xff1f; 在嵌入式系统开发中&#xff0c;代码质量直接关系到产品的稳定性和安全性。由于嵌入式设备通常部署在关键基础设施、工业控制或消费电子产品中&#xff0c;代码缺陷可能导致严重后果。静态代码扫描作为代码质量保障的重要手段…...