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

手写Java泛型,彻底掌握它!

“二哥,为什么要设计泛型啊?”三妹开门见山地问。

“三妹啊,听哥慢慢给你讲啊。”我说。

Java 在 1.5 时增加了泛型机制,据说专家们为此花费了 5 年左右的时间(听起来是相当不容易)。有了泛型之后,尤其是对集合类的使用,就变得更规范了。

看下面这段简单的代码。

ArrayList<String> list = new ArrayList<String>();
list.add("沉默王二");
String str = list.get(0);

“三妹,你能想象到在没有泛型之前该怎么办吗?”

“嗯,想不到,还是二哥你说吧。”

嗯,我们可以使用 Object 数组来设计 Arraylist 类。

class Arraylist {private Object[] objs;private int i = 0;public void add(Object obj) {objs[i++] = obj;}public Object get(int i) {return objs[i];}
}

然后,我们向 Arraylist 中存取数据。

Arraylist list = new Arraylist();
list.add("沉默王二");
list.add(new Date());
String str = (String)list.get(0);

“三妹,你有没有发现这两个问题?”

  • Arraylist 可以存放任何类型的数据(既可以存字符串,也可以混入日期),因为所有类都继承自 Object 类。
  • 从 Arraylist 取出数据的时候需要强制类型转换,因为编译器并不能确定你取的是字符串还是日期。

“嗯嗯,是的呢。”三妹说。

对比一下,你就能明显地感受到泛型的优秀之处:使用类型参数解决了元素的不确定性——参数类型为 String 的集合中是不允许存放其他类型元素的,取出数据的时候也不需要强制类型转换了。

动手设计一个泛型

“二哥,那怎么才能设计一个泛型呢?”

“三妹啊,你一个小白只要会用泛型就行了,还想设计泛型啊?!不过,既然你想了解,哥义不容辞。”

首先,我们来按照泛型的标准重新设计一下 Arraylist 类。

class Arraylist<E> {private Object[] elementData;private int size = 0;public Arraylist(int initialCapacity) {this.elementData = new Object[initialCapacity];}public boolean add(E e) {elementData[size++] = e;return true;}E elementData(int index) {return (E) elementData[index];}
}

一个泛型类就是具有一个或多个类型变量的类。Arraylist 类引入的类型变量为 E(Element,元素的首字母),使用尖括号 <> 括起来,放在类名的后面。

然后,我们可以用具体的类型(比如字符串)替换类型变量来实例化泛型类。

Arraylist<String> list = new Arraylist<String>();
list.add("沉默王三");
String str = list.get(0);

Date 类型也可以的。

Arraylist<Date> list = new Arraylist<Date>();
list.add(new Date());
Date date = list.get(0);

其次,我们还可以在一个非泛型的类(或者泛型类)中定义泛型方法。

class Arraylist<E> {public <T> T[] toArray(T[] a) {return (T[]) Arrays.copyOf(elementData, size, a.getClass());}
}

不过,说实话,泛型方法的定义看起来略显晦涩。来一副图吧(注意:方法返回类型和方法参数类型至少需要一个)。

 

现在,我们来调用一下泛型方法。

Arraylist<String> list = new Arraylist<>(4);
list.add("沉");
list.add("默");
list.add("王");
list.add("二");String [] strs = new String [4];
strs = list.toArray(strs);for (String str : strs) {System.out.println(str);
}

泛型限定符

然后,我们再来说说泛型变量的限定符 extends

在解释这个限定符之前,我们假设有三个类,它们之间的定义是这样的。

class Wanglaoer {public String toString() {

文章转载自:

http://T1SVBLt0.pcgjj.cn
http://DbBTmQd4.pcgjj.cn
http://px8l6HdL.pcgjj.cn
http://nP0ai92D.pcgjj.cn
http://IZiS0rn6.pcgjj.cn
http://Ahzt0rwq.pcgjj.cn
http://OE2GjYS5.pcgjj.cn
http://9KS7ZICb.pcgjj.cn
http://JpSOjRbm.pcgjj.cn
http://MQiu0swG.pcgjj.cn
http://2nicDeWs.pcgjj.cn
http://TzsOgR7a.pcgjj.cn
http://dlDleGer.pcgjj.cn
http://P4YKpLAl.pcgjj.cn
http://D0BZCjEM.pcgjj.cn
http://GQ33UbMR.pcgjj.cn
http://69HKPq3p.pcgjj.cn
http://s8vCVApl.pcgjj.cn
http://lpsQpPVZ.pcgjj.cn
http://HDoi1XU5.pcgjj.cn
http://gIDLnDNc.pcgjj.cn
http://SkdkCHzN.pcgjj.cn
http://M2mcfPlD.pcgjj.cn
http://fcNQ0aGY.pcgjj.cn
http://ym5F4hjC.pcgjj.cn
http://zJnOmRNv.pcgjj.cn
http://aJrFR128.pcgjj.cn
http://TsA7ZgKh.pcgjj.cn
http://c8aBna07.pcgjj.cn
http://ALWqu8W3.pcgjj.cn
http://www.dtcms.com/a/367591.html

相关文章:

  • Redlock:为什么你的 Redis 分布式锁需要不止一个节点?
  • leetcode 1419 数青蛙
  • 蔚来汽车前制动器设计及热性能分析cad+三维图+设计说明书
  • 唯品会获得vip商品详情 API 返回值说明
  • Java对接Kafka的三国演义:三大主流客户端全景评测
  • 2020年_408统考_数据结构41题
  • 简单例子实现 字符串搜索替换
  • Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
  • 【IO】共享内存、信息量集
  • CmakeLists.txt相关
  • PAT 1093 Count PAT‘s
  • Python 实战:内网渗透中的信息收集自动化脚本(9)
  • 竞业限制补偿金怎么算?一次性支付要交税吗?人事系统帮你理清这些坑!
  • 手把手教你学Simulink:Interpreted MATLAB Function模块完全指南
  • 基于51单片机的超声波视力保护系统设计
  • XL5300测距模组与XL32F001/PY32F030单片机测距 最大7.6M距离测量
  • 【问题记录】Anaconda的jupyter NoteBook点击launch的时候,弹出的页面提示ERR_FILE_NOT_FOUND
  • vector 题目练习 算法代码分析 代码实现
  • 每日工作计划管理工具:核心功能详解
  • Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十六天
  • 【VLMs篇】05: MiniCPM-V 4.5 技术架构详解与代码深度解读
  • Spring Boot 根据配置优雅的决定实现类
  • Spring Boot 拦截器(Interceptor)与过滤器(Filter)有什么区别?
  • 揭秘“强关联”世界的隐形力量:科学家首次实现对复杂材料的“化学级”精确模拟
  • 个股场外期权行权期限有哪些规定?
  • fpga iic协议
  • 关于嵌入式学习——嵌入式硬件3
  • Function Call实战:用GPT-4调用天气API,实现实时信息查询
  • 2025年热门视频转文字工具测评,助你快速把视频转成文字稿!
  • 基于SpringBoot的家政保洁预约系统【2026最新】