【Java 基础】16 泛型
文章目录
- 什么是泛型?
- 泛型的声明
- 泛型的使用
- 泛型方法
- 通配符和泛型上下界
- 1)通配符
- 2)泛型上下界
- 泛型的好处
- 注意事项
泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型,我们可以编写更加 通用、 灵活、 可读性高的代码,同时 减少类型转换和运行时错误。
什么是泛型?
泛型(Generics)是一种参数化类型的概念
它使得我们可以编写能够适用于多种类型的代码,而不是为每种类型都写一份代码。泛型提供了编译时的类型检查,使得代码更加安全,并且减少了在运行时进行频繁的类型转换
例如:
我们之前有为很多箱子都贴上了固定的标签!
装 苹果,老鼠,小狗,因为不能放一起呀!虽然,狗现在已经不多管闲事去拿耗子啦_
有多少种类就需要多少箱子,新增加一个就需要再增加,就很麻烦
于是我们想到了,箱子不贴固定的名称,来一种就装一种,这样就不需要为每一种单独定义一个标签啦
之前的 苹果,老鼠,小狗等等箱子,就是具体的类型。而后来的 东西,就是一个泛型。
泛型的声明
在 Java 中,泛型主要通过在类、接口、方法中使用泛型类型参数来实现。
下面就使用泛型去定义一个箱子
// 定义一个泛型类(比如这就是一个装东西的箱子)
class Box<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}
上述代码中,Box 类使用了泛型类型参数 T,使得这个类可以存储和返回任意类型的数据。
泛型的使用
使用上面已经定义好的箱子去装各种各样的东西
先往里装一种类型的东西,如老鼠
public static void main(String[] args) {// 可以往箱子里装 int 型数字(比如这就是老鼠)Box<Integer> integerBox = new Box<>();integerBox.setValue(42);int intValue = integerBox.getValue();System.out.println(intValue);}
输出结果:42
再往里装另一种类型的东西,如小狗
public static void main(String[] args) {// 还可以往箱子里装 String 型的字符(比如这就是小狗)Box<String> stringBox = new Box<>();stringBox.setValue("哈士奇");String stringValue = stringBox.getValue();System.out.println(stringValue);}
输出结果:哈士奇
泛型方法
除了泛型类,Java 还支持泛型方法。泛型方法可以在普通类中定义,也可以在泛型类中定义。
以下是一个简单的泛型方法的例子:
// 定义一个泛型方法
public static <E> void printBoxSaveWhat(E e) {System.out.println("箱子里装的是: " + e);
}
// 使用泛型方法
public static void main(String[] args) {// 打印第一种类型printBoxSaveWhat(42);// 打印外一种类型printBoxSaveWhat("哈士奇");
}
输出结果:
箱子里装的是: 42
箱子里装的是: 哈士奇
上述代码中,printBoxSaveWhat 方法是一个泛型方法,可以接受任意类型的参数。在使用时,编译器会根据传入的实际参数类型进行类型推断。
通配符和泛型上下界
Java 泛型还引入了通配符和泛型上下界的特性。
1)通配符
用于表示未知类型
示例代码:
// 使用通配符
public static void printValues(List<?> values) {for (Object value : values) {System.out.println(value);}
}public static void main(String[] args) {System.out.println("开始打印 整数");List<Integer> integers = Arrays.asList(1, 2, 3);printValues(integers);System.out.println("开始打印 小数");List<Double> doubles = Arrays.asList(1.1, 2.2);printValues(doubles);
}
输出结果:
开始打印 整数
1
2
3
开始打印 小数
1.1
2.2
在上述代码中,printValues 方法使用了通配符 ?,允许接受任意类型的 List。
2)泛型上下界
用于限定泛型类型的范围
示例代码:
// 使用泛型上下界
public static <T extends Number> double sum(List<T> numbers) {double total = 0;for (T number : numbers) {total += number.doubleValue();}return total;
}public static void main(String[] args) {List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);System.out.println("整数的加和结果是: " + sum(integers));List<Double> doubles = Arrays.asList(1.1, 2.2, 3.3, 4.4);System.out.println("小数的加和结果是: " + sum(doubles));
}
输出结果:
整数的加和结果是: 15.0
小数的加和结果是: 11.0
在上述代码中, sum 方法使用了泛型上下界 T extends Number,表示只能接受 Number 类型或其子类型
泛型的好处
- 类型安全: 泛型提供了编译时的类型检查,避免了在运行时发生类型错误的可能性。
- 代码复用: 泛型允许编写通用的代码,适用于多种数据类型,提高了代码的复用性。
- 可读性和可维护性: 使用泛型能够使代码更加清晰、简洁,提高了代码的可读性和可维护性。
注意事项
- 类型擦除: 泛型在编译时会进行类型擦除,即泛型信息在运行时被擦除,转换为原始类型。这可能导致一些限制,例如不能直接创建泛型数组。
- 通配符限制: 使用通配符
<?>时,只能读取,无法修改泛型集合中的元素。如果需要修改,可以使用<? extends T>或<? super T>。 - 泛型和继承: 泛型不支持协变(covariant)和逆变(contravariant)。例如,
List不是List的子类型。 - 原始类型和泛型混用: 尽量避免在泛型代码中使用原始类型,以保持类型安全。
用通配符 <?> 时,只能读取,无法修改泛型集合中的元素。如果需要修改,可以使用 <? extends T> 或 <? super T>。
- 泛型和继承: 泛型不支持协变(covariant)和逆变(contravariant)。例如,
List不是List的子类型。 - 原始类型和泛型混用: 尽量避免在泛型代码中使用原始类型,以保持类型安全。
在实际编程中,合理利用泛型可以使代码更加健壮、灵活,但也需要注意一些泛型的特性和限制。通过了解和熟练使用泛型,可以写出更加清晰、安全和可维护的 Java 代码。
相关文章:
【Java 基础】16 泛型
文章目录 什么是泛型?泛型的声明泛型的使用泛型方法通配符和泛型上下界1)通配符2)泛型上下界 泛型的好处注意事项 泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型,我们可以编写更加 通用、 灵活、 可读性高的…...
Android framework定制1-->用户无操作一段时间,自动播放客户提供的视频,用户操作后退出播放
在PowerManagerService.java中监听用户操作,10秒无操作则打开预置的apk播放视频,直接上代码: --- a/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javab/frameworks/base/services/core/java/com/andr…...
Vmware17虚拟机安装windows10系统
不要去什么系统之家之类的下载镜像,会不好安装,镜像被魔改过了,适合真实物理机上的系统在PE里安装系统,建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…...
Golang实践录:读取yaml配置文件
本文对 yaml 文件进行解析。 下载 yaml执行 go get github.com/spf13/viper 安装。 golang 有很多库可以解释 yaml 文件。本文选用 viper 进行解析,执行 go get github.com/spf13/viper 安装。 yaml语法规则 yaml对大小写敏感。yaml的层级关系只能使用空格缩进&a…...
oracle sql相关语法
SQL*PLUS 在SQL*PLUS执行,会在执行后显示查询的执行计划和统计信息 SET AUTOTRACE ON;SELECT * FROM your_table WHERE column_name value;SET AUTOTRACE OFF;PLSQL PLSQL查询sql界面,鼠标右键,点击执行计划,会出现sql的执行计…...
el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并
el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并,并且不能跨品名合并 如图 用到el-table合并行的方法合并 tableSpanMethod({ row, column, rowIndex, columnIndex }) {if (column.property "materielName") {//合并商品名const _row this…...
微信小程序显示二维码?
wxml <canvas style"width: 100%;height: 100%;margin-left: 20%;" id"Canvase" type"2d"></canvas> js // pages/code/code.js Page({/*** 页面的初始数据*/data: {code: ,},/*** 生命周期函数--监听页面加载*/onLoad(options) {…...
JavaWeb开发全流程笔记
JavaWeb 前端Web开发javaScript1.JS引入2.JS基础语法3.JS函数4.JS对象 BOMDOM文档对象模型JS事件监听VueVue常用指令Vue的生命周期 AjaxAxios 前端工程化环境准备NodeJS安装和Vue-cli安装vue项目Vue组件库Element组件的使用 Vue路由Nginx打包部署 后端Web开发MavenSpringBootHT…...
LLM;超越记忆《第 2 部分 》
一、说明 在这篇博客中,我深入研究了将大型语言模型(LLM)提升到基本记忆之上的数学框架。我们探索了动态上下文学习、连续空间插值及其生成能力,揭示了 LLM 如何理解、适应和创新超越传统机器学习模型。 LLM代表了人工智能的重大飞…...
Python中的加法测试题实现
随机生成5道10以内的加法测试题,用户在10秒内使用键盘输入答案。完成全部5道答题之后,计算机生成答题记录报告,并对答题情况进行分析,显示“答对了”,或“答错了”、并显示正确答案。如果未能按时完成,则显…...
使用gcloud SDK 管理和部署 Cloud run service
查看cloud run 上的service 列表: gcloud run services list > gcloud run services listSERVICE REGION URL LAST DEPLOYED BY LAST DEPL…...
JS逆向-mytoken之code参数
前言 本文是该专栏的第60篇,后面会持续分享python爬虫干货知识,记得关注。 本文以mytoken为例,通过js逆向获取其code参数的生成规律。具体的“逆向”思路逻辑,笔者将会详细介绍每个步骤,并且将在正文结合“完整代码”进行详细说明。 接下来,跟着笔者直接往下看正文详细…...
第九节HarmonyOS 常用基础组件4-Button
一、Button Button组件主要用来响应点击操作,可以包含子组件。 示例代码: Entry Component struct Index {build() {Row() {Column() {Button(确定, { type: ButtonType.Capsule, stateEffect: true }).width(90%).height(40).fontSize(16).fontWeigh…...
常用数据预处理方法 python
常用数据预处理方法 数据清洗缺失值处理示例删除缺失值插值法填充缺失值 异常值处理示例删除异常值替换异常值 数据类型转换示例数据类型转换在数据清洗过程中非常常见 重复值处理示例处理重复值是数据清洗的重要步骤 数据转换示例 数据集成示例数据集成是将多个数据源合并为一…...
【无标题】AttributeError: module ‘gradio‘ has no attribute ‘outputs‘
问题描述 AttributeError: module gradio has no attribute outputs 不知道作者用的是哪个gradio版本,最新的版本报错AttributeError: module gradio has no attribute outputs , 换一个老一点的版本会报错AttributeError: module gradio has no attribu…...
无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv7开发构建电力设备螺母缺销小目标检测识别系统
传统作业场景下电力设备的运维和维护都是人工来完成的,随着现代技术科技手段的不断发展,基于无人机航拍飞行的自动智能化电力设备问题检测成为了一种可行的手段,本文的核心内容就是基于YOLOv7来开发构建电力设备螺母缺销检测识别系统…...
动态页面技术的发展与应用
jsp 静态页面:web诞生后的html文档,不论多少次访问都是同一份html文档或者是其他的什么文档,所以说是”静态“的。 虽然js能让页面产生互动,但是不论什么人访问,看到的都是放在服务器的那一份写死的文件/文档activexa…...
1-算法基础-编程基础
1.基本数据类型 char ch A; char s[] "hello";2.const定义常量 const int N 1e5 9;//const定义常量,后续不可被修改 int a[N];3.万能头文件 C11等可用 #include<bits/stdc.h> using namespace std;4.typedef typedef long long kk; kk a[20…...
HarmonyOS应用开发——程序框架UIAbility、启动模式与路由跳转
前言 UIAbility简单来说就是一种包含用户界面的应用组件,用于和用户进行交互。每一个UIAbility实例,对应于一个最近任务列表中的任务。 一个应用可以有一个UIAbility,也可以有多个UIAbility。一个UIAbility可以对应于多个页面,建议…...
node.js-连接SQLserver数据库
1.在自己的项目JS文件夹中建文件:config.js、mssql.js和server.js以及api文件夹下的user.js 2.在config.js中封装数据库信息 let app {user: sa, //这里写你的数据库的用户名password: ,//这里写数据库的密码server: localhost,database: medicineSystem, // 数据…...
javaweb农业合作社果蔬批发农产品商城信息管理系统的设计与实现
目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析交易与订单模块数据分析与报表模块物流与配送模块系统管理模块技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能…...
马上深挖!!!三段逆置如何实现数组轮转?!用最简单的话让你秒懂
一、目的给定一个数组和一个整数k,让数组向右轮转k个数。如令[1,2,3,4,5,6]向右轮转3个数,结果为[4,5,6,1,2,3]。二、代码#include <iostream> using namespace std;void swap(int* a,int* b) {int tmp*a;*a*b;*btmp;return; }void reverse(int* a…...
SEM优化和SEO优化的成本是多少_SEM优化和SEO优化的未来展望如何
SEM优化和SEO优化的成本是多少 在当今数字化营销的时代,SEM(搜索引擎营销)和SEO(搜索引擎优化)已经成为企业获取在线流量的两大关键手段。许多企业在投入这些优化策略时,往往会对其成本产生疑虑。本文将深…...
合规刚需下,游戏行业适合的内网通讯软件怎么选
一、背景 2026年,游戏行业在合规监管、信创推进与降本增效三重驱动下,内部协作与数据安全需求持续升级。《数据安全法》《网络安全法》对游戏企业研发代码、运营数据、用户信息的存储与传输提出明确合规要求,数据泄露、权限失控、协作低效等…...
为Qwen-VL“点亮”视觉思维:从注意力热力图洞察多模态对齐的深层逻辑
1. 理解Qwen-VL的视觉思维机制 当你第一次看到Qwen-VL这类视觉语言模型时,可能会好奇它究竟是如何"看"图片的。想象一下,你正在教一个小朋友看图说话:小朋友会先扫视整张图片,然后目光停留在某些关键区域,最…...
从“无风扇散热”到“完美机房”:我与AI的一场散热与存储深度对话
本文源于我与AI的一次技术探讨,从无风扇散热模组的工作原理出发,逐步深入到浸泡式液冷、热辐射优化、算力中心架构,最终延伸至存储介质的可靠性对比。这是一次从“芯片级散热”到“系统级存储”的完整技术认知之旅。前言:一个好奇…...
PDF-Parser-1.0效果实测:中文识别超99%,表格公式完美提取
PDF-Parser-1.0效果实测:中文识别超99%,表格公式完美提取 1. 开篇实测体验 当我第一次使用PDF-Parser-1.0处理一份15页的技术文档时,结果让我感到惊讶。这份文档包含复杂的中英文混排内容、3个跨页表格和5个数学公式,传统OCR工具…...
InvokeAI工具函数库:10个核心工具方法与实用辅助函数详解
InvokeAI工具函数库:10个核心工具方法与实用辅助函数详解 【免费下载链接】InvokeAI Invoke is a leading creative engine for Stable Diffusion models, empowering professionals, artists, and enthusiasts to generate and create visual media using the late…...
【ESP32-S3】通过ROS2使用YDLIDAR X2进行SLAM、自主导航方案选择
通过ROS2使用YDLIDAR X2进行SLAM、自主导航方案选择背景一、方案总览(两种主流实现)方案A:纯透传(最简,推荐入门)方案B:Micro-ROS(标准ROS 2架构,适合完整导航࿰…...
OPCUA结构体数据处理全解析:C#如何高效读写ExtensionObject中的复杂数据
OPCUA结构体数据处理全解析:C#如何高效读写ExtensionObject中的复杂数据 在工业自动化与物联网系统中,OPCUA协议已成为设备间数据交换的事实标准。当面对复杂的自定义结构体数据时,ExtensionObject的处理往往成为开发者的痛点。本文将深入剖析…...
