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

Java 泛型详解(超详细的java泛型方法解析)

1. 为什么使用泛型早期的Object类型可以接收任意的对象类型但是在实际的使用中会有类型转换的问题。也就存在这隐患所以Java提供了泛型来解决这个安全问题。来看一个经典案例123456789101112publicstaticvoidmain(String[] args) {//测试一下泛型的经典案例ArrayList arrayList newArrayList();arrayList.add(helloWorld);arrayList.add(taiziyenezha);arrayList.add(88);//由于集合没有做任何限定任何类型都可以给其中存放for(inti 0; i arrayList.size(); i) {//需求打印每个字符串的长度,就要把对象转成String类型String str (String) arrayList.get(i);System.out.println(str.length());}}运行这段代码程序在运行时发生了异常Exception in thread main java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String发生了数据类型转换异常这是为什么由于ArrayList可以存放任意类型的元素。例子中添加了一个String类型添加了一个Integer类型再使用时都以String的方式使用导致取出时强制转换为String类型后引发了ClassCastException因此程序崩溃了。这显然不是我们所期望的如果程序有潜在的错误我们更期望在编译时被告知错误而不是在运行时报异常。而为了解决类似这样的问题在编译阶段就可以解决在jdk1.5后泛型应运而生。让你在设计API时可以指定类或方法支持泛型这样我们使用API的时候也变得更为简洁并得到了编译时期的语法检查。我们将第一行声明初始化ArrayList的代码更改一下编译器就会在编译阶段就能够帮我们发现类似这样的问题。现在再看看效果。1234ArrayListString arrayList newArrayList();arrayList.add(helloWorld);arrayList.add(taiziyenezha);arrayList.add(88);// 在编译阶段编译器就会报错这样可以避免了我们类型强转时出现异常。2. 什么是泛型泛型是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。也就是说在泛型使用过程中操作的数据类型被指定为一个参数而这种参数类型可以用在类、方法和接口中分别被称为泛型类、泛型方法、泛型接口。注意:一般在创建对象时将未知的类型确定具体的类型。当没有指定泛型时默认类型为Object类型。3. 使用泛型的好处避免了类型强转的麻烦。它提供了编译期的类型安全确保在泛型类型通常为泛型集合上只能使用正确类型的对象避免了在运行时出现ClassCastException。4. 泛型的使用泛型虽然通常会被大量的使用在集合当中但是我们也可以完整的学习泛型只是。泛型有三种使用方式分别为泛型类、泛型方法、泛型接口。将数据类型作为参数进行传递。4.1 泛型类泛型类型用于类的定义中被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种集合框架容器类如List、Set、Map。泛型类的定义格式修饰符 class 类名代表泛型的变量 { }怕你不清楚怎么使用这里我还是做了一个简单的泛型类123456789101112131415161718/*** param T 这里解释下T中的T:* 此处的T可以随便写为任意标识常见的有T、E等形式的参数表示泛型* 泛型在定义的时候不具体使用的时候才变得具体。* 在使用的时候确定泛型的具体数据类型。即在创建对象的时候确定泛型。*/publicclassGenericsClassDemoT {//t这个成员变量的类型为T,T的类型由外部指定privateT t;//泛型构造方法形参t的类型也为TT的类型由外部指定publicGenericsClassDemo(T t) {this.t t;}//泛型方法getT的返回值类型为TT的类型由外部指定publicT getT() {returnt;}}泛型在定义的时候不具体使用的时候才变得具体。在使用的时候确定泛型的具体数据类型。即在创建对象的时候确定泛型。例如GenericString genericString new GenericString(helloGenerics);此时泛型标识T的类型就是String类型那我们之前写的类就可以这么认为123456789publicclassGenericsClassDemoString {privateString t;publicGenericsClassDemo(String t) {this.t t;}publicString getT() {returnt;}}当你的泛型类型想变为Integer类型时也是很方便的。直接在创建时T写为Integer类型即可GenericInteger genericInteger new GenericInteger(666);注意 定义的泛型类就一定要传入泛型类型实参么并不是这样在使用泛型的时候如果传入泛型实参则会根据传入的泛型实参做相应的限制此时泛型才会起到本应起到的限制作用。如果不传入泛型类型实参的话在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型。即跟之前的经典案例一样没有写ArrayList的泛型类型容易出现类型强转的问题。4.2 泛型方法泛型方法是在调用方法的时候指明泛型的具体类型 。定义格式修饰符 代表泛型的变量 返回值类型 方法名(参数){ }例如12345678910111213141516/**** param t 传入泛型的参数* param T 泛型的类型* return T 返回值为T类型* 说明* 1public 与 返回值中间T非常重要可以理解为声明此方法为泛型方法。* 2只有声明了T的方法才是泛型方法泛型类中的使用了泛型的成员方法并不是泛型方法。* 3T表明该方法将使用泛型类型T此时才可以在方法中使用泛型类型T。* 4与泛型类的定义一样此处T可以随便写为任意标识常见的如T、E等形式的参数常用于表示泛型。*/publicT T genercMethod(T t){System.out.println(t.getClass());System.out.println(t);returnt;}调用方法时确定泛型的类型12345publicstaticvoidmain(String[] args) {GenericsClassDemoString genericString newGenericsClassDemo(helloGeneric);//这里的泛型跟下面调用的泛型方法可以不一样。String str genericString.genercMethod(hello);//传入的是String类型,返回的也是String类型Integer i genericString.genercMethod(123);//传入的是Integer类型,返回的也是Integer类型}这里我们可以看下结果:class java.lang.Stringhelloclass java.lang.Integer123这里可以看出泛型方法随着我们的传入参数类型不同他得到的类型也不同。泛型方法能使方法独立于类而产生变化。4.3 泛型接口泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中。定义格式1修饰符 interface接口名代表泛型的变量 { }看一下下面的例子你就知道怎么定义一个泛型接口了123456/*** 定义一个泛型接口*/publicinterfaceGenericsIntefaceT {publicabstractvoidadd(T t);}使用格式1、定义类时确定泛型的类型123456publicclassGenericsImpimplementsGenericsIntefaceString {Overridepublicvoidadd(String s) {System.out.println(设置了泛型为String类型);}}2、始终不确定泛型的类型直到创建对象时确定泛型的类型123456publicclassGenericsImpTimplementsGenericsIntefaceT {Overridepublicvoidadd(T t) {System.out.println(没有设置类型);}}确定泛型123456publicclassGenericsTest {publicstaticvoidmain(String[] args) {GenericsImpInteger gi newGenericsImp();gi.add(66);}}5. 泛型通配符当使用泛型类或者接口时传递的数据中泛型类型不确定可以通过通配符?表示。但是一旦使用泛型的通配符后只能使用Object类中的共性方法集合中元素自身方法无法使用。

相关文章:

Java 泛型详解(超详细的java泛型方法解析)

1. 为什么使用泛型早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。来看一个经典案例:123456789101112public static void main(String[]…...

从‘水中人’到‘系统英雄’:用Python+Flask手把手教你搭建一个匿名英雄事迹记录平台

从匿名善举到技术赋能:用Flask构建英雄事迹共享平台 在华盛顿波托马克河冰冷的河水中,那个将救生设备一次次让给他人、最终消失在湍流中的无名男子,用行动诠释了人性最耀眼的光芒。这种无需留名的善举,恰恰构成了现代社会最稀缺的…...

手把手教你用Python模拟光的偏振:从马吕斯定律到椭圆偏振光生成

用Python模拟光的偏振:从马吕斯定律到椭圆偏振光实战指南 偏振光是光学领域中一个既基础又充满魅力的现象。想象一下,当你戴着偏光太阳镜仰望蓝天时,镜片如何巧妙地过滤掉刺眼的眩光——这正是偏振原理在日常生活中的直观体现。对于理工科学生…...

分布式文件系统数据漂移治理:监测、诊断与自动修复实践

1. 项目概述:从“ClawdEFS/drift”看分布式文件系统的数据漂移挑战最近在梳理分布式存储系统的运维记录时,一个名为“ClawdEFS/drift”的内部项目标题反复出现,它精准地概括了我们过去几年在维护一个大规模、多区域部署的类EFS(弹…...

机器学习参数化与非参数化算法对比与应用

1. 机器学习算法分类全景图当我们需要从数据中提取规律时,算法选择往往决定了项目的成败。在机器学习领域,参数化与非参数化算法构成了两大核心方法论体系,它们代表了建模过程中对数据分布假设的根本性差异。参数化方法就像带着固定尺寸的模具…...

手把手教你用DAVIS346事件相机复现EV-Eye眼动追踪实验(附数据集下载与代码解析)

基于DAVIS346事件相机的EV-Eye眼动追踪全流程复现指南 当眼球以700/秒的速度运动时,传统摄像头就像用网兜捕捉子弹——而事件相机则像用高速摄影机记录每一颗弹道的轨迹。这种生物启发的视觉传感器正在重新定义眼动追踪的技术边界。本文将带您从零开始复现EV-Eye这一…...

Swoole WebSocket + LLM流式响应架构升级(2026企业级避坑手册)

更多请点击: https://intelliparadigm.com 第一章:Swoole WebSocket LLM流式响应架构升级(2026企业级避坑手册) 在高并发实时交互场景中,传统 HTTP 轮询或长连接难以支撑 LLM 流式输出的低延迟、高吞吐需求。Swoole …...

别再问JDK怎么装了!Win11下Java环境变量配置保姆级避坑指南(附JDK8/11/17/21安装包)

Win11下Java开发环境配置全攻略:从安装到避坑实战 每次看到新手在配置Java环境时反复踩坑,我都会想起自己当年对着命令行反复输入java -version却只得到"不是内部或外部命令"的挫败感。今天我们就来彻底解决这个问题,不仅告诉你正…...

告别Socket烦恼:用DotNetty在.NET 6/8里快速搭建一个Echo服务器(附完整源码)

用DotNetty构建高可靠Echo服务的实战指南 在.NET生态中处理TCP通信时,许多开发者都经历过原生Socket带来的阵痛——繁琐的连接管理、回调地狱式的异步处理、难以维护的状态同步。我曾在一个物联网平台项目中,因为传统TcpListener的线程阻塞问题导致服务在…...

浏览器中的法线贴图生成器:3分钟将普通图片转为专业3D纹理

浏览器中的法线贴图生成器:3分钟将普通图片转为专业3D纹理 【免费下载链接】NormalMap-Online NormalMap Generator Online 项目地址: https://gitcode.com/gh_mirrors/no/NormalMap-Online 你是否曾经为3D模型缺乏表面细节而烦恼?或者想要为游戏…...

Transformer面试别再背八股文了!用这5个可视化工具,把多头注意力、位置编码彻底搞懂

Transformer面试不再死记硬背:5个可视化工具彻底掌握多头注意力与位置编码 在技术面试中,关于Transformer架构的问题常常让候选人陷入两难:要么机械背诵概念定义,要么面对"为什么这样设计"的追问哑口无言。传统学习方式…...

视频下载助手:解锁在线视频保存的终极解决方案

视频下载助手:解锁在线视频保存的终极解决方案 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾因无法保存喜欢的在线视频…...

EPLAN 2.9破解版安装后,第一张电路图怎么画?端子排、符号库实战教学

EPLAN 2.9实战入门:从零绘制第一张电路图 刚安装完EPLAN 2.9的工程师常会遇到一个尴尬局面——软件界面复杂得让人无从下手。别担心,今天我们就用最直白的方式,带你完成第一个包含端子排的完整电路图。忘记那些枯燥的理论,直接动手…...

OBS虚拟摄像头终极指南:3分钟学会专业视频流转换

OBS虚拟摄像头终极指南:3分钟学会专业视频流转换 【免费下载链接】obs-virtual-cam 项目地址: https://gitcode.com/gh_mirrors/obs/obs-virtual-cam 想要将OBS Studio的专业视频效果无缝应用到Zoom、Teams等视频会议软件中吗?OBS-VirtualCam正是…...

利用 Taotoken 为内部知识库问答系统接入智能语义理解能力

利用 Taotoken 为内部知识库问答系统接入智能语义理解能力 1. 知识库问答系统的智能化需求 企业内部知识库系统通常包含大量文档、手册和常见问题解答,传统的关键词检索方式难以满足员工对精准语义理解的需求。通过接入大模型能力,可以实现自然语言提问…...

LiDAR-惯性里程计标定与自适应定位技术解析

1. LiDAR-惯性里程计技术概述LiDAR-惯性里程计(LIO)作为现代机器人导航系统的核心组件,通过融合激光雷达(LiDAR)与惯性测量单元(IMU)的感知数据,实现了在GNSS拒止环境下的高精度定位…...

Unity开发效率翻倍!用Odin插件5分钟搞定自定义Inspector(附常用Attribute清单)

Unity开发效率革命:Odin插件打造专业级Inspector全指南 你是否经历过这样的场景:当策划同事皱着眉头问你"这个数值到底该怎么填"时,你只能无奈地解释Unity默认Inspector的晦涩布局;或者当美术同学需要频繁调整角色属性时…...

SH1107 OLED屏幕竖屏显示实战:手把手教你用C语言实现90度旋转(附完整代码)

SH1107 OLED屏幕竖屏显示实战:从算法原理到嵌入式实现 在智能手表、便携式医疗设备和工业手持终端等垂直显示场景中,开发人员常常面临一个棘手问题:多数OLED屏幕原生仅支持水平显示模式。SH1107作为广泛使用的OLED驱动芯片,其硬件…...

别再只加压敏电阻了!汽车直流有刷电机EMC整改,滤波电容怎么选才有效?

直流有刷电机EMC整改实战:从电容谐振特性到精准滤波策略 实验室里,示波器上跳动的波形和频谱分析仪上那些刺眼的红色超标频点,可能是每个EMC工程师最熟悉的"噩梦场景"。特别是当面对汽车直流有刷电机这类"噪声大户"时&am…...

Weka机器学习工具:从入门到实战应用指南

1. Weka机器学习工作台概览Weka(Waikato Environment for Knowledge Analysis)是新西兰怀卡托大学开发的经典机器学习工具集,最初为农业数据研究而设计,如今已成为教学科研领域最受欢迎的入门级机器学习平台之一。我第一次接触Wek…...

使用Taotoken后月度AI模型开支变得清晰可预测的实际体验

使用Taotoken后月度AI模型开支变得清晰可预测的实际体验 1. 多供应商账单的痛点 过去在同时使用多个大模型供应商时,每个平台都有独立的计费方式和账单周期。有的按调用次数收费,有的按token阶梯定价,还有的采用订阅制加超额计费。每月需要…...

MCP 2026实时修复能力全解析,覆盖Log4j2、Spring4Shell、ZeroLogon等17类高危漏洞的内存级热修复实践

更多请点击: https://intelliparadigm.com 第一章:MCP 2026实时修复能力全景概览 MCP 2026(Mission-Critical Patching 2026)是新一代面向高可用系统的内核级热修复框架,支持在不中断服务、不重启进程的前提下动态注入…...

FourierSampler在分布式大语言模型训练中的优化实践

1. 项目背景与核心价值FourierSampler作为新兴的采样技术,在分布式大语言模型(dLLMs)训练中展现出独特优势。这项技术通过频域变换重构了传统采样的计算范式,使得模型在分布式环境下能够更高效地捕捉长程依赖关系。我在实际部署中…...

通过 curl 命令快速调试 Taotoken API 接口连通性与参数

通过 curl 命令快速调试 Taotoken API 接口连通性与参数 1. 准备工作 在开始调试前,请确保已获取有效的 Taotoken API Key。登录 Taotoken 控制台,在「API 密钥」页面创建或复制现有密钥。同时确认您拥有可执行 curl 命令的环境,包括 Linux…...

MCP 2026国产化迁移成本黑洞:3类隐性开销未计入预算(附工信部认证TCO测算模板V2.6)

更多请点击: https://intelliparadigm.com 第一章:MCP 2026国产化迁移成本黑洞的本质解构 MCP(Mission-Critical Platform)2026 是面向高可靠场景的下一代国产化平台标准,其迁移过程常被低估为“替换操作系统重编译”…...

告别疯狂Loading!优化el-tree懒加载数据回显的3个实战技巧(含代码)

深度优化el-tree懒加载数据回显的工程化实践 当管理后台遇到超深层级树形结构时,数据回显往往成为性能黑洞。我曾亲历一个省级金融机构项目,在权限树回显时因不当的懒加载处理导致页面卡顿长达8秒。本文将分享从实战中提炼的三套组合拳方案,帮…...

DistilBart模型在企业级文本摘要中的实践与优化

1. 项目概述:基于DistilBart模型的文本摘要实践去年在优化内容运营流程时,我遇到了海量文本信息处理的瓶颈。每天需要从数百篇行业报告中提取核心观点,传统人工摘要方式效率低下且存在主观偏差。经过多轮技术选型测试后,最终采用H…...

专业揭秘:AI专著生成如何实现?多款工具助力20万字专著高效完成!

学术专著的活力主要体现在逻辑的严谨性上,但在写作过程中,逻辑论证往往是最容易出错的环节。撰写专著需要围绕核心观点进行系统的论证,既要全面阐述每个论点,还需对各个学派的分歧进行处理,同时要确保整个理论框架的一…...

开源AI物理模拟框架sim:从数据学习物理规律,驱动3D内容生成

1. 项目概述:当AI开始“理解”物理世界最近在AI生成内容(AIGC)的圈子里,一个名为“sim”的项目引起了我的注意。它来自一个叫“simstudioai”的团队,名字很简洁,但野心不小。简单来说,sim是一个…...

用Python和MATLAB手把手教你:从冲激响应到频响曲线的完整信号分析流程

从冲激响应到频响曲线的实战指南:Python与MATLAB双平台实现 信号处理工程师经常需要分析未知系统的频率特性,比如音频设备、通信信道或机械振动系统。传统教材往往侧重理论推导,而实际工程中更关注如何快速获取可靠数据。本文将用代码驱动的方…...