Java帝国之泛型

23、Java泛型深度解析:从概念到实践 本文深入解析了Java泛型的核心概念与实践,包括类型擦除机制、原始类型与参数化类型的关系、泛型方法与边界定义,以及泛型与多态的结合应用。通过实例分析,探讨了Java泛型在编译时与运行时的行为差异,并提供了使用泛型的最佳实践建议,帮助开发者编写更安全、高效和可维护的Java代码。 阅读详情

1

新王登基

登基以后第一次早朝, 意气风发的第5代Java国王坐在宝座上,看着下面恭恭敬敬的各位大臣,心情大好。

他早已下定决心,要刷新吏治,革除弊端,将Java帝国带上更高的巅峰。 

国王的第一道命令就是要求各位大臣展开一场轰轰烈烈的自检运动,对自己负责的领域好好检查一遍,倾听一下帝国臣民们的呼声,半个月以后,每个大臣至少要报上来三条合理化建议。 

下面的大臣心说这肯定是三分钟热度,过段时间国王就忘了。虽然这么想,嘴上还是说道:“陛下圣明,真乃开天辟地之举,定会使我Java帝国江山永固。”

没想到半个月后又一次早朝,国王真的开始检查作业了: “IO大臣,你那里情况如何? ”

老奸巨猾的IO大臣虽然挨了当头一棒,愣了一下,但是马上恢复了:“陛下,我Java帝国自成立以来,经过先祖们励精图治,制度几近完美, 国家繁荣昌盛,子民们无不交口称颂, 我这里实在是没有什么可以改进的了。”

其他大臣也纷纷附和:“IO大臣所言极是,臣这里也找不到了” 。 

国王看着这些不干事儿的官僚,恨得牙痒痒:“哼哼! 你们没有,朕这里可是有啊,来人,宣C++帝国的使者进殿!”

2

C++使者

一个年轻人在大家狐疑的目光中走了进来, 在大殿中央给国王行了礼。 

国王说道:“这是C++国王来的使者,他带来了一个我们帝国没有的新玩意儿。 泛型先生,你一路舟车劳顿,辛苦了,烦请你给我们说说C++王国的泛型吧。” 

看来国王早就和这个家伙串通好了,等着给我们好看呢, 要小心, IO大臣警觉起来。

这个被称为泛型先生的家伙说:“Java语言以严谨而著称, 但是设计的时候却没有把泛型这个重要的概念给考虑进去,确实是不应该啊。”

“什么是泛型? 能举个例子吗?” 线程大臣问道。

泛型先生展示了一段代码:

0?wx_fmt=png


集合框架大臣一看这小子竟然想拿自己开刀,这还了得, 接过话头儿说:“这有什么问题?”

小伙子说: “我向List当中加了一个字符串和整数, 看起来没有问题,可是使用List的人就麻烦了,他必须得知道第一个元素是字符串类型, 第二个是Integer, 还得强制转型,要不然就会出错。”

0?wx_fmt=png


“这不很正常吗? ” 集合框架大臣问道 “ 写程序的那些码农当然要记住每个元素的类型了, 再说了,我这个List 能容纳任何类型的元素,多灵活!”

泛型使者说:“这么做会增加使用者的责任,编译器也无法帮忙, 在运行时才会抛出Class Cast 异常。”

“那你说说,怎么才能让编译器帮忙?”

“这就是我来这里的目的了,在我的家乡C++帝国, 我们可以定义一个模板类,例如:”  

0?wx_fmt=png

“这里定义了一个模板类List ,  通过它你可以实例化成你想要的任何类型,例如List<int>, List<string>,List<Employee>......   上面的代码实例化了一个List<int>,所以你只能往里边添加整数,如果添加其他类型的值例如字符串, 编译器就能检查出来,直接报错。  我们C++帝国把这种能力称为泛型(Generics)  ”

集合框架大臣笑道: “哈哈,这么古怪的语法,怪不得你们C++越来越.... ”  一转眼看到Java国王那威严的目光, 他生生地把后半句给咽了进去。 

 “众位爱卿,估计你也看到了,这个‘泛型’能够在编译期检查出错误, 使用List的人也不用做强制转型了,还是很有好处的。我们Java 也应该加上类似功能”  

“怎么加上呢? ” 集合框架大臣问道。

“好办啊,仿照C++的语法就行了”  Java国王心想,这些占据高位,但是又不做事的家伙们以后要统统替换掉。 

国王让吕公公展开了一张写满代码的纸:

0?wx_fmt=png

 “大家看看这段代码,看到那个T没有,你可以它想象成一个占位符,将来可以传入任意类型,例如Integer, String等等”

0?wx_fmt=png

集合框架大臣一看国王连代码都写好了,心说这国王也真够拼的, 看来是铁了心要这么干了。 

3

泛型实现

IO大臣说:“陛下圣明,臣愚钝,还有一事不明,这个所谓的泛型,怎么实现呢?”

C++泛型使者说: “在我们C++帝国,每次你去实例化一个泛型/模板类都会生成一个新的类,例如模板类是List ,然后你用int ,double,string, Employee 分别去实例化, 那编译的时候,我们就会生成四个新类出来,例如List_int和List_double,List_string, List_Employee。” 

集合框架大臣说:“啊?! 这样一来得生成很多新的类出来啊,系统会不会膨胀得要爆炸了。”

国王说:“不用担心,我已经给C++的泛型使者深谈过,我们不用膨胀法, 相反,我们用擦除法。”

“擦除法? ” 众大臣面面相觑。 

“简单来说就是一个参数化的类型经过擦除后会去除参数, 例如ArrayList<T> 会被擦除为ArrayList”

“那我传入的String,Integer等都消失了?”  集合框架大臣大惊失色。

“不会的,我会把他们变成Object ,  例如ArrayList<Integer>其实被擦除成了原始的ArrayList :

0?wx_fmt=png

线程大臣问道: “陛下, 我们通过泛型, 本来是不想让臣民们写那个强制转型的,臣民们可以写成这样 Integer i = list1.get(0);   现在类型被擦除,都变成Object了, 怎么处理啊? ”

Java国王说: “ 很简单啊, 在编译的时候做点手脚,加个自动的转型嘛: Integer i = (Integer)list1.get(0);”

“陛下真是高瞻远瞩, 臣等拜服”  IO大臣马上拍马屁。

4

泛型方法

集合框架大臣说: “陛下,刚才您说的都是泛型类, 对于一些静态方法该怎么办?”

0?wx_fmt=gif0?wx_fmt=png

“简单啊,把那个<T>移到方法上去!” 国王的命令不容置疑

0?wx_fmt=gif

0?wx_fmt=png

集合框架大臣看了一会,自言自语到: “这个静态的函数是求最大值的,就是说需要对List中的元素比较大小,如果臣民们传入的T没有实现Comparable接口,就没法比较大小了!”

线程大臣,IO大臣纷纷点头称是。

王国心想这些大臣也不是一无是处,还是有点想法的嘛, 他转向C++的使者:  “这倒是个难题, 泛型使者, 你怎么看?”

“这个容易,可以做一个类型的限制, 让臣民们传入类型T必须是Comparable的子类才行, 要不然编译器就报错, 我建议使用extends关键字。” C++的泛型使者看起来很有经验。

0?wx_fmt=gif

0?wx_fmt=png

“妙啊” 国王大为赞赏  “来人, 赏金500两! ”

IO大臣提议: “陛下,臣提议让泛型使者在京城多呆几天,协助我们把Java泛型给实现了。”

国王说:“准奏,这是一件大事情, 希望各位爱卿同心协力, 办好后朕还有重赏。”

(老刘注: 除了extends之外, Java泛型还支持super,   实际上为了更加灵活,上面的Comparable<T> 应该写成Comparable <? super T> , 这里不再展开描述。)

5

泛型和继承

经过了几个月的准备, Java泛型正式推出,开始让臣民们使用了。 

不出国王和大臣所料, 泛型极大程度地减少了运行期那些转型导致的异常,简化了代码,受到了大家的一致欢迎。 

国王特地设置了一个泛型大臣的职务, 暂时让集合框架大臣兼任, 没办法,集合框架的改动是泛型的一个重头戏。

过了几天, 泛型大臣兼集合框架大臣上了一个奏章,上面有一张图和若干代码:

0?wx_fmt=png

0?wx_fmt=png

国王觉得很诧异,这是怎么回事,print函数能接受的参数不是ArrayList<Fruit>吗? 当传递一个ArrayList<Apple>为什么出错呢, 难道我们Java帝国的多态不管用了吗?

他召来泛型大臣问个明白。 

泛型大臣说:“陛下明鉴,这个Apple 虽然是Fruit的子类, 但是 ArrayList<Apple>却不是 ArrayList<Fruit>的子类,实际上他们俩之间是没有关系的,不能做转型操作,所以调用print的时候就报错了。”

0?wx_fmt=png

“为什么不能让ArrayList<Apple>转成ArrayList<Fruit>呢?  ”

“如果可以这么做的话, 那么不但可以向这个list中加入Apple, 还可以加入Orange, 泛型就被破坏了”

0?wx_fmt=png

“奥,原来如此”  国王心想泛型大臣还是不错滴。 “那针对刚才的问题怎么办呢?”

“我和各位大臣商量了,我们打算引入一个通配符的方式来解决, 把函数的输入参数改为改成下面这样:”

0?wx_fmt=png

“也就是说,传进来的参数,只要是Fruit或者Fruit的子类都可以,对吧”  国王看出了关键。

“是的,陛下,这样以来就可以接收ArrayList<Fruit> 和 ArrayList<Apple> ,ArrayList<Orange> 这样的参数了!”

“好吧,虽然看起来有点不爽, 就这么实施吧!”

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《2016文章精华》或者《2017上半年文章精华》


优秀人才不缺工作机会,只缺适合自己的好机会。但是他们往往没有精力从海量机会中找到最适合的那个。

100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「最好的公司」相遇。

扫描下方二维码,注册 100offer,谈谈你对下一份工作的期待。一周内,收到 5-10 个满足你要求的好机会!

0?wx_fmt=jpeg

JavaWeb学生成绩管理系统毕设实战:从环境搭建到二次开发避坑指南 JSP、Servlet与JDBC是JavaWeb开发的经典技术组合,理解其MVC分层原理与数据库连接机制,是掌握企业级Web应用的基础。在实际工程中,环境配置、编码链路与连接池优化直接影响系统稳定性与性能。学生成绩管理系统作为典型应用场景,涵盖多角色权限、成绩统计与考勤管理,适合作为毕设项目或实战练习。本文围绕一套可直接运行的JavaWeb源码,梳理从Tomcat部署、MySQL导入到Filter统一编码与Druid连接池改造的完整路径,并给出高频问题排查清单,帮助开发者快速跑通项目并完成二次开发。 阅读详情

相关推荐

HBF凭什么能挑战HBM?

最近AI圈聊得最多的,除了大模型迭代,就是“算力瓶颈”。大家都知道GPU不够用、HBM抢疯了,但很少有人注意到,存储层正在酝酿一场革命——高带宽闪存(HBF)。今天就结合HBM之父Joungho Kim教授的最新观点,跟大家好好盘盘这门技术:它不是HBM的替代品,却可能重塑AI推理的游戏规则,甚至在2038年超越HBM市场规模。先澄清一个核心认知:HBF不是凭空冒出来的新技术,而是站在HBM肩膀上的“优化款”。

存储随笔 2130

码农翻身精华文章

让你豁然开朗的干货文章合集,通俗易懂

perry_Fan 3万+

海康威视web控件开发+vue结合做网页开发

需求:vue的项目,需要在页面展示出海康的硬盘录像机连接的摄像头的实时监控画面以及回放功能. 准备:web开发包(包含插件以及demo,在海康官网即可下载32位64位的都有.那些需要积分下载的博主良心不疼么.) 点击这里下载:链接: https://pan.baidu.com/s/12FrbycWyWWyiRJH5Yd1tPA 提取码: gam5 开始开发: 1.安装demo目录下的WebComponentsKit.exe插件(根据自己的浏览器以及系统选择32位还是64位的插件) 2.打.

u013682258的博客 8485

java 泛型 T 和 Object 那些故事

java中泛型运用的目的就是实现对象的重用,这样一个Object我想应该可以了吧,为什么还要新增一个类型?  经查阅资料,发现泛型T和Object类其实在编写时没有太大区别,只是JVM中没有T这个概念,T只是存在于编写  时,进入虚拟机运行时,虚拟机会对泛型标志进行擦除,也就是替换T会限定类型替换(根据运行时类型),如果  没有限定就会用Object替换。     同时Object可以ne

lifeflowers的神秘世界 4007

三菱FX5U通信之CCLINK操作步骤

11. 连接 CC‐Link 用的端子排,连接 Ver.1.10 对应 CC‐Link 专用电缆。备注:1、以上对应的寄存器都是一一对应的,主站的点数可以比从站多,但是都需要一一对应起来。3.直接安装孔,用于直接安装的螺钉孔(2‐φ4.5,安装螺钉为 M4 螺钉)2.点阵 LED(显示模块中设置的站号和测试模式的内容)5.次段扩展连接器(连接扩展模块的扩展电缆的连接器)4.动作状态(显示 LED 显示模块的动作状态)10 电源连接器,用于连接电源电缆的连接器。1.扩展电缆(扩展时连接用的电缆)

ZXL622722的博客 6932

紫光同创国产FPGA学习之Fabric Debugger

文章从紫光同创参考书拷贝过来的。因为我用的时候,看了一下就会用了(纯粹只是会用了,默认和xilinx的一样),没有看教程。先更新点文本,后面在写程序。 一、      软件简介 Fabric Debugger是一款界面化的FPGA芯片调试工具,能够针对公司目前以及未来的FPGA芯片进行在线调试。本软件直接与JtagHub、DebugCore交互,能够实时的配置目标FPGA、设置触发条件并且观测结...

my_share的专栏 6397

Java帝国之宫廷内斗

前言: 本文是《持久化:Java帝国反击战》续集,开始讲解分布式事务。1JDBC大臣自从和东海之滨的数据库联合酋长国缔结了合作协议以后, IO大臣就退居二线了。他本来也...

码农翻身 420

STM32----SPI+DMA高效读写外部Flash的配置与实战

本文详细介绍了STM32通过SPI+DMA高效读写外部Flash的配置与实战方法。针对大量数据传输场景,使用DMA技术可显著提升系统效率,释放CPU资源。文章包含完整的代码实现、常见问题调试技巧以及性能优化建议,帮助开发者快速掌握这一关键技术。

pea55的博客 1032

java之用故事来理解泛型

    大家好,我是一个泛型,我的出现是为了代表不同的参数类型,以减少因为数据类型而对代码造成的束缚,同时使代码更简洁。     比如小明为公司开发一个接口,这个接口可以传入不同的数据类型,那么在我没诞生前,小明需要写多个接口,如下: public interface ICommonGeneric { String get(String a); Integer get(Intege...

weixin_34205076的博客 136

告别ROS1思维:在ROS2 Humble上,用Python搞定MoveIt2机械臂控制的完整流程

本文详细介绍了在ROS2 Humble环境下使用Python控制MoveIt2机械臂的完整流程。从环境配置、架构变革到实战操作,涵盖URDF适配、Action接口编程及性能优化技巧,帮助开发者高效迁移ROS1项目至ROS2平台,实现工业级机械臂控制。

weixin_30352645的博客 451

针对中文CLIP模型训练失效的解决方案记录

解决了中文CLIP模型无法正确训练的问题

weixin_45906434的博客 1622

Java 帝国对 Python 的渗透能成功吗?

作者丨刘欣 责编 | 伍杏玲 本文经授权转载自码农翻身(ID:coderising) 2019年人工智能系统学: https://edu.youkuaiyun.com/topic/ai30?utm_source=cxrs_bw 引子 Java 帝国已经成立20多年,经过历代国王的励精图治,可以说是地大物博,码农众多。 可是国王依然不满足,整天想着如何继续开拓...

程序人生的博客 2243

33、AI赋能5G/6G通信:LDPC码解码与强化学习技术解析

本文探讨了基于AI和强化学习的LDPC码技术在5G/6G通信中的应用。包括LAMS解码器、神经MS解码器、盲识别方法、统一极性-LDPC解码器、NNMS和SNNMS解码器、N-2D-NMS解码器、神经分层MS解码器、MAB-NS方案以及强化学习与MCTS结合的技术。这些技术在提升解码性能、降低计算复杂度和增强系统适应性方面表现出色,为未来通信系统的发展提供了强有力的支持。

lambda的博客 244

SpringFramework|@Qualifier与泛型配合使用

@Qualifier与泛型配合使用 前述 Java: 1.8 Maven: 3 SpringFramework版本以及各组件成员: 5.1.1.RELEASE spring-context spring-core spring-beans 除了@Qualifier注释之外,您还可以使用Java泛型类型作为隐式的限定形式。 (@Senyag) 示例(基于注解配置) 背景: 电影院...

aijuanlie5852的博客 283

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java帝国对Python的渗透能成功吗?

引子 Java 帝国已经成立20多年,经过历代国王的励精图治,可以说是地大物博,码农众多。  可是国王依然不满足,整天想着如何继续开拓疆土, 这一天晚上他又把几个重臣招来商议了。  IO大臣说:“陛下,现在天下大势初定,我Java帝国已经占据了后端开发,大数据,Android开发等重要地盘,再想拓展殊为不易!”   “是啊, 前端被JavaScript所盘踞,我们很难渗透啊。” 线程大臣补...

勇往直前的专栏 768

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《码农翻身》之Java帝国

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/a724888/article/details/81321455 这位大侠,这是我的公众号:程序员江湖。 分享程序员面试与技术的那些事。 干货...

weixin_34404393的博客 374

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C语言函数指针与指针函数:从原理到工业级实战

函数指针和指针函数是C语言类型系统中两大基础而易混淆的概念,本质区别在于‘指针’修饰对象不同:前者是指向函数的变量,用于实现回调、策略模式与状态机;后者是返回指针的函数,常用于动态内存分配、链表节点访问与安全数据提取。其核心价值在于提升代码解耦性、可扩展性与运行时灵活性,在嵌入式开发、Linux驱动、协议解析等场景中不可或缺。理解二者差异需紧扣编译器类型检查机制与内存语义——函数指针承载代码地址,参与间接调用;指针函数封装数据地址,承担资源交付职责。本文结合qsort定制排序、温控状态机、线程安全strto

diaoju3333的博客 500

java 泛型详解

目录 泛型小故事 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.5 泛型上下边界 4.6关于泛型数组要提一下 泛型小故事 IO大臣说:“陛下圣明,臣愚钝,还有一事不明,这个所谓的泛型,怎么实现呢?” C++泛型使者说: “在我们C++帝国,每次你去实例化一个泛型/模板类都会生成一个新...

应无所住而生其心 1244

java泛型通配符捕获_Java 泛型中的通配符

前言本文并不是要从头开始介绍泛型,只要是对Java稍有了解的人大概都不会对泛型感到陌生,如果对泛型还完全没有过了解,可以参考这两篇文章。Java泛型就是这么简单Java帝国之泛型Java官方教程-通配符而本文主要是小结一下学习泛型时遇到的一些疑惑。通配符的疑问基本上只要是扯到通配符的都没搞清楚过,比如说: 1. 通配符到底是干嘛用的? 2. 它和常用的泛型T之间有什么区别? 3. 上界通配符(? ...

weixin_33164837的博客 381

java 参数类型不确定_Java 泛型中的通配符

前言本文并不是要从头开始介绍泛型,只要是对Java稍有了解的人大概都不会对泛型感到陌生,如果对泛型还完全没有过了解,可以参考这两篇文章。 Java泛型就是这么简单 Java帝国之泛型 Java官方教程-通配符而本文主要是小结一下学习泛型时遇到的一些疑惑。通配符的疑问基本上只要是扯到通配符的都没搞清楚过,比如说: 1. 通配符到底是干嘛用的? 2. 它和常用的泛型T之间有什么区别? 3. 上界通配符...

weixin_39597636的博客 1279

Java泛型

1新王登基 登基以后第一次早朝, 意气风发的第5代Java国王坐在宝座上,看着下面恭恭敬敬的各位大臣,心情大好。 他早已下定决心,要刷新吏治,革除弊端,将Java帝国带上更高的巅峰。 国王的第一道命令就是要求各位大臣展开一场轰轰烈烈的自检运动,对自己负责的领域好好检查一遍,倾听一下帝国臣民们的呼声,半个月以后,每个大臣至少要报上来三条合理化建议。 下面的大臣心说这肯定是三分钟热度,过段时间...

weixin_30686845的博客 104

通配符_Java 泛型中的通配符

前言本文并不是要从头开始介绍泛型,只要是对Java稍有了解的人大概都不会对泛型感到陌生,如果对泛型还完全没有过了解,可以参考这两篇文章。 Java泛型就是这么简单 Java帝国之泛型 Java官方教程-通配符而本文主要是小结一下学习泛型时遇到的一些疑惑。通配符的疑问基本上只要是扯到通配符的都没搞清楚过,比如说: 1. 通配符到底是干嘛用的? 2. 它和常用的泛型T之间有什么区别? 3. 上界通配符...

weixin_32646781的博客 127
上一篇: 在大学期间更应该学习什么?
下一篇: 我和Linux
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值