news 2026/4/25 6:24:02

对于泛型的设计思路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
对于泛型的设计思路

前面了解到,

java基础代码
其实也就是处理一堆数据。

那其实有个bug。
就是,只能传类型确定的数据
我们在写一段代码的时候。
如果想传递和接受,不确定类型的数据,应该怎么办

于是发明了泛型这个概念。

你理解得很准!泛型(Generics)就是为了解决“代码写死类型、无法复用”这个问题而生的。

痛点演示:没有泛型时怎么办?

你想写一个打印任意类型数组的方法:

// 只能打印String数组publicstaticvoidprintString(String[]arr){...}// 只能打印Integer数组publicstaticvoidprintInteger(Integer[]arr){...}// 只能打印Double数组 → 还得再写一个... 无穷无尽

有人会说:用Object不就行了?

publicstaticvoidprint(Object[]arr){for(Objecto:arr){System.out.println(o);}}

但有问题

  • ❌ 取出元素必须强制转型,容易ClassCastException
  • ❌ 编译期不检查类型,错误推迟到运行期
  • ❌ 没有“这个数组里只能是同一种类型”的约束

泛型解决方案

把类型也当作一个“参数”传进去,用<T>表示:

// T 代表“待定的类型”publicstatic<T>voidprint(T[]arr){for(Tt:arr){System.out.println(t);}}// 使用时,自动推导类型String[]strs={"a","b"};Integer[]nums={1,2,3};print(strs);// 编译器理解为 print<String>print(nums);// 编译器理解为 print<Integer>

对比效果

用 Object用泛型
编译时类型检查❌ 无✅ 有
取出元素需强转✅ 需要❌ 不需要
代码复用度一般
类型安全

泛型最经典的例子:集合类

// 没有泛型时(旧代码),一个篮子啥都能装Listlist=newArrayList();list.add("hello");list.add(123);// 混入不同类型Strings=(String)list.get(0);// 强转,第2个元素取出来就报错// 有泛型后,明确约束List<String>list2=newArrayList<>();list2.add("hello");// list2.add(123); // 编译错误!类型不匹配Strings2=list2.get(0);// 无需强转

泛型的核心概念

1. 泛型类/接口

classBox<T>{privateTcontent;publicvoidset(Tt){content=t;}publicTget(){returncontent;}}Box<String>box=newBox<>();// 这里的String是“类型实参”

2. 泛型方法(刚才展示的)

3. 类型通配符?

当你不确定具体类型,只想表达“某种类型”时:

publicvoidprintList(List<?>list){// 可以接收 List<String> / List<Integer> ...for(Objecto:list)System.out.println(o);}

4. 上限extends/ 下限super

// 只允许 Number 及其子类List<?extendsNumber>nums;// 只允许 Integer 及其父类List<?superInteger>ints;

一个更贴近你之前“数据处理”的例子

假设你要写一个“数据处理器”,处理不同类型的数值:

// 泛型接口interfaceProcessor<T>{Tprocess(Tinput);}// String 处理器classStringReverseimplementsProcessor<String>{publicStringprocess(Strings){returnnewStringBuilder(s).reverse().toString();}}// Integer 处理器classIntegerDoubleimplementsProcessor<Integer>{publicIntegerprocess(Integern){returnn*2;}}// 使用Processor<String>p1=newStringReverse();Stringresult=p1.process("abc");// "cba"

泛型在 Java 中的“小缺点”(相对于 C++ 模板)

类型擦除:泛型只在编译期检查,运行时会擦掉类型信息。

List<String>list1=newArrayList<>();List<Integer>list2=newArrayList<>();// 下面这行会输出 true,因为运行时都是 ArrayListSystem.out.println(list1.getClass()==list2.getClass());

为什么?为了兼容旧版本 Java(1.4 之前没有泛型)。


总结

你的问题泛型的答案
只能传类型确定的数据<T>把类型参数化
代码写死类型类型变成可传入的“参数”
需要强制转型编译期自动补上,类型安全

一句话记忆:泛型 = 类型的参数化,让你写出“处理任意类型数据的通用代码”,同时保留编译时的类型检查。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 6:23:22

SQL窗口函数实战:5个高频场景完整代码

大家好&#xff0c;我是船长。今天聊一个数据分析里最容易被问到的问题&#xff1a;SQL窗口函数。很多人在面试的时候会被问到&#xff0c;但真正用过的人其实不多。今天船长把实际工作中最常用的5个场景完整代码分享出来。01 什么是窗口函数&#xff1f;先说基础概念。普通聚合…

作者头像 李华
网站建设 2026/4/25 6:16:49

Python 爬虫进阶技巧:正则表达式高效提取网页关键数据实战

前言 在网络数据采集领域,Python 凭借丰富的第三方库成为爬虫开发的首选语言,而正则表达式作为文本处理的核心工具,是爬虫工程师必须掌握的进阶技能。相较于 XPath、CSS 选择器等结构化解析方式,正则表达式具备极强的灵活性,无需依赖网页 DOM 结构,即可从非结构化、半结…

作者头像 李华
网站建设 2026/4/25 6:15:52

AI智能体平台VenusFactory2:零代码驱动蛋白质工程与生命科学研究

1. 项目概述&#xff1a;一个为生命科学从业者打造的AI智能体平台如果你是一名生物学家、生物信息学研究员&#xff0c;或者正在从事蛋白质工程、药物发现相关的工作&#xff0c;那么你很可能已经感受到了AI浪潮带来的冲击。从AlphaFold2在结构预测上的革命性突破&#xff0c;到…

作者头像 李华
网站建设 2026/4/25 6:15:51

LSTM时间序列数据预处理与三维输入格式详解

1. 理解LSTM网络对时间序列数据的基本要求在处理时间序列数据时&#xff0c;LSTM&#xff08;长短期记忆网络&#xff09;作为一种特殊的循环神经网络&#xff0c;对输入数据有着特定的格式要求。与普通的前馈神经网络不同&#xff0c;LSTM能够捕捉时间序列中的长期依赖关系&am…

作者头像 李华
网站建设 2026/4/25 6:14:48

教育医学类期刊速览:高影响因子SSCI期刊推荐 | 青年教师评副高优选——3 本被低估高质量教育医学类 SSCI,审稿高效、综合认可度高,闭眼可投

还在发愁教育、行为医学方向发文难&#xff1f; 高分顶刊内卷严重&#xff0c;普通期刊认可度不足&#xff0c;想要分区优质、审稿高效、适合晋升 / 毕业的 SSCI 这 3 本宝藏期刊一定要收藏&#xff0c;门槛友好、含金量十足。 Discourse-Studies in the Cultural Politics o…

作者头像 李华
网站建设 2026/4/25 6:14:47

3分钟搞定B站视频下载:解锁4K大会员画质的完整方案

3分钟搞定B站视频下载&#xff1a;解锁4K大会员画质的完整方案 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为无法离线观看B站…

作者头像 李华