news 2026/8/16 7:04:02

Java 泛型的学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 泛型的学习笔记

什么是泛型?

泛型是在JDK5引入的新特性,使用“<数据类型>“符号表示泛型。使用泛型的接口、类、方法,会在编译阶段,要求编译器检查数据类型是否匹配,从而达到限制数据类型的目的。比如:

publicclassDemo0{publicstaticvoidmain(String[]args){List<String>list=newArrayList<>();// 使用泛型<String>,集合在编译阶段就被限定为只能存放String类型的元素。编译器会检查所有相关操作,确保类型匹配。list.add("hello");// 添加的元素符合泛型限制的数据类型String, 所以可以添加// list.add(new Dog("小黄", 1)); // 添加的Dog元素不符合泛型限制的数据类型,编译器会直接报错,代码无法通过编译。}}

上方代码中,泛型的数据类型指定为String类型,则在List对象中添加的元素,只能是String类型,而添加其他类型(比如Dog类型)的元素,会在编译阶段报错。

为什么要引入泛型?

在引入泛型之前,有一些有关数据类型的难题。

如果我要定义一个列表,假如说希望这个列表可以存放所有数据类型的元素,我只能将存储元素的数据结构体定义为Object。但是,现在产生了一个问题,由于存放的元素都是Object类型,对元素的操作就只能使用Object的方法,而不能用元素特定的方法。如果要使用特定数据类型的方法,则需要强制类型转换,这会抛出ClassCastException异常。

// 如果没有泛型,那么只能用Object类型存储集合中的元素publicclassMyList1{// 自定义一个指定容量的List类privateObject[]array;privateintsize;publicMyList1(intcapacity){array=newObject[capacity];}publicvoidadd(Objecto){array[size]=o;size++;}publicObjectget(intindex){returnarray[index];}publicintsize(){returnsize;}}
publicclassDemo2{publicstaticvoidmain(String[]args){// 创建自定义List对象MyList1list=newMyList1(10);list.add("hello");// 添加Stirng类型元素list.add(100);// 添加int类型元素(自动装箱为Integer类型)list.add(newDog("小黄"));// 添加Dog类型元素for(inti=0;i<list.size();i++){Objecto=list.get(i);System.out.println(o.toString());// 只能使用Object类型的实例方法}// 强制类型转换,则会抛出ClassCastException异常// for(int i = 0; i < list.size(); i++) {// Dog s = (Dog) list.get(i); // s.eat(); // } }}

当然,这种情况下,如果列表都存储数据类型的元素,也可以强制做数据类型转换,之后即可调用该元素的数据类型的方法。比如:

publicclassDemo3{publicstaticvoidmain(String[]args){MyList1list=newMyList1(10);// 存放相同数据类型的元素list.add("hello");list.add("world");list.add("java");for(inti=0;i<list.size();i++){Strings=(String)list.get(i);// 强制类型转换System.out.println(s.length());}}}

也就是说,在没有泛型时,我们只能依赖代码编写时,程序员注意保持相同的数据类型,并且要手动做强制类型转换。这种很容易出错。

引入泛型,用”< T>“,相当于引入了一个数据类型变量"T",让”T“作为存储元素的数据结构类型。

publicclassMyList2<T>{// 自定义一个指定容量的List类privateT[]array;privateintsize;publicMyList2(intcapacity){array=(T[])newObject[capacity];}publicvoidadd(To){array[size]=o;size++;}publicTget(intindex){returnarray[index];}publicintsize(){returnsize;}}

在编译阶段,编译器会根据<String>对类型T进行严格的检查和推断,所有使用T的地方都被视为String

在运行时(JVM层面),这个“替换”并没有发生。Java的泛型是通过 “类型擦除” 实现的。也就是说,在编译后的字节码中,T被替换成了它的上界(在你这里是Object),MyList2<String>MyList2<Integer>在运行时其实是同一个类。

publicclassDemo4{publicstaticvoidmain(String[]args){MyList2<String>list=newMyList2<>(10);// 使用泛型类存放字符串元素list.add("hello");list.add("world");// list.add(new Dog("小黄")); // 添加Dog类型元素,编译器会报错}}

如上代码,在添加Dog类型元素时,编译器会报类型错误。因为编译器会认为你在调用add方法时,需要使用String类型,而不应该用Dog类型。

publicvoidadd(Stringo){// T 已被替换成Stringarray[size]=o;size++;}

综上所述,引入泛型后,可以让编译器检查数据类型约束,减少错误。

初次之外,泛型还提供两个价值:

  1. 代码复用,使用泛型,就不需要为每个数据类型单独写一个接口、类或方法。比如,写了一个Collection< T >,就可以创建Collection< String >、Collection < Integer >等。
  2. 代码可读性。List<String>一眼就能看出这个列表里放的是什么,比List然后靠注释说明清晰得多。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 3:16:27

PKHeX宝可梦自动化修改工具:从手动烦恼到一键合规的实战指南

PKHeX宝可梦自动化修改工具&#xff1a;从手动烦恼到一键合规的实战指南 【免费下载链接】PKHeX-Plugins Plugins for PKHeX 项目地址: https://gitcode.com/gh_mirrors/pk/PKHeX-Plugins 你是否曾经花费数小时手动调整宝可梦的个体值、努力值和技能组合&#xff0c;却发…

作者头像 李华
网站建设 2026/7/31 12:21:23

群晖NAS USB网卡驱动终极指南:轻松实现2.5G网络升级

群晖NAS USB网卡驱动终极指南&#xff1a;轻松实现2.5G网络升级 【免费下载链接】r8152 Synology DSM driver for Realtek RTL8152/RTL8153/RTL8156 based adapters 项目地址: https://gitcode.com/gh_mirrors/r8/r8152 还在为群晖NAS的千兆网口速度限制而烦恼吗&#x…

作者头像 李华
网站建设 2026/8/11 0:45:20

ModernVBERT:250M参数刷新视觉文档检索速度

导语&#xff1a;近日&#xff0c;一款名为ModernVBERT的轻量级视觉语言模型引发关注&#xff0c;其仅250M参数却实现了与10倍规模模型相当的性能&#xff0c;同时显著提升了视觉文档检索的处理速度&#xff0c;为企业级文档管理和信息提取应用带来新可能。 【免费下载链接】mo…

作者头像 李华
网站建设 2026/8/9 23:26:16

虚拟串口与上位机通信协议对接实践

虚拟串口与上位机通信&#xff1a;从协议设计到实战调试的完整链路打通 你有没有遇到过这样的场景&#xff1f; 手头只有一个物理串口&#xff0c;却要同时调试多个设备&#xff1b;想远程查看现场PLC的数据&#xff0c;但现场没人接线&#xff1b;开发阶段频繁插拔USB转串口线…

作者头像 李华
网站建设 2026/8/3 0:59:05

Qwen3-Omni:AI音频解析大师,低幻觉精准描述!

Qwen3-Omni&#xff1a;AI音频解析大师&#xff0c;低幻觉精准描述&#xff01; 【免费下载链接】Qwen3-Omni-30B-A3B-Captioner 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-Omni-30B-A3B-Captioner AI音频理解领域迎来重大突破——Qwen3-Omni-30B-A3B-C…

作者头像 李华
网站建设 2026/7/31 12:21:57

D3.js定制化渲染IndexTTS2复杂数据关系图谱,视觉冲击强

D3.js定制化渲染IndexTTS2复杂数据关系图谱&#xff0c;视觉冲击强 在AI语音合成系统日益复杂的今天&#xff0c;开发者面对的不再只是“输入文本、输出音频”这样简单的黑箱流程。以开源项目 IndexTTS2 V23 为例&#xff0c;其背后是一个包含文本预处理、音素对齐、情感建模、…

作者头像 李华