【Java】泛型
来源:互联网 发布:js函数返回值 编辑:程序博客网 时间:2024/05/29 08:29
1. 概念解析
首先要知道这里的泛型是针对参数类型而言的,从字面上理解:“泛”字很好理解,体现的当然是“泛化”也就是“抽象”思想,在某种程度上扩展了参数类型的范围。“型”字又可(狭隘的)理解为强类型支持,即参数类型必须属于某种类型;而且对此种类型又可能做一定的限制,也就是所谓的“泛型参数约束”。“强类型支持”与“泛型参数约束”都在某种程度上限制了参数类型的范围,体现了“细化”的思想。
2. 泛型的作用
上面说了“泛”体现了抽象的思想,也就是将参数类型进行高层次抽象,从而使参数类型由依赖于具体转到了依赖于抽象,这样就使得代码可以复用,程序更加灵活。而“型”字,理解为强类型支持+泛型参数约束,也就是规定了参数类型必须是某种类型,而且可能对此类型还另附加一定的约束条件。“强类型支持”避免了隐式的装箱、拆箱,从而提高了程序的性能;强类型支持+泛型参数约束决定了在编译时就可找到不符合参数类型要求的地方,这样就保证了编译时的类型安全,从而避免了运行时的类型转换错误。总结一下就是,“泛”是为了代码可以复用,程序更加灵活;“型”是为了提高程序的性能与安全。
3. 什么时候需要用泛型?该怎么用?
上面提到了,泛型的作用主要有两个:【作用一】通过抽象参数类型,从而代码可以复用,程序更加灵活;【作用二】通过强类型支持与泛型参数约束,从而提高程序的性能与安全。那么这样就很明白什么时候需要用泛型了:
3.1 当参数类型不固定,易变化,想使得程序可以灵活应对时,泛型的【作用一】或可解决,例如:
如上图所示为,冒泡排序算法在“不使用泛型”与“使用泛型”两种情况下的写法。前者只能对int数组类型进行排序;后者是对只要继承了IComparable接口的类型(例如char、int,下图所示)对应的数组都可以进行排序。
黄色高亮处为从不使用泛型到使用泛型所更改的地方,可以看到总共有4处修改:
Ø 首先,方法名后面加了<T>,代表参数单元必须为T类型,即所谓的“强类型支持”。
Ø 然后,参数类型由确定的int[]变为了不确定的T[],即所谓的“参数类型抽象”。
Ø 然后,方法后面加了whereT:IComparable,代表T类型必须实现IComparable接口,即所谓的“泛型参数约束”。
Ø 然后,比较方法由”<”变为了CompareTo(object)方法,此方法存在于IComparable接口中,正是char、int等类型中提取的共同的特征,因为它们都实现了这个接口。
如下图:int、char类型都实现了IComparable接口:
实例总结:未使用泛型的算法之所以不能适用多种类型,根本原因是该算法使用了某一种类型所特有的东西,即:array[j]<array[j-1]中的“<”号。所以想要适用多种类型,只需找到这多种类型的对象都适用的比较方法即可,恰好C#中有通用的比较方法,即:CompareTo(object),而此方法位于IComparable接口中,所以只要实现了此接口就可享用它的CompareTo(object)方法。于是我们对这多种类型进行了抽象得出类型T(不确定类型),再让T实现IComparable接口,不就相当于多种类型都实现了该接口吗,都实现了该接口不就都可以享用接口的CompareTo(object)方法了吗,这个问题不就解决了吗。
该实例解决问题的思路是找变化点,找相同点;然后想法用相同点替换变化点。主要手段是“抽象参数类型”,当然也并带了“强类型支持”与“泛型参数约束”。
3.2 当想提高程序性能与安全性时,泛型的【作用二】或可解决
因为“强类型支持”避免了隐式的装箱、拆箱,从而提高了程序的性能;如下实例:
强类型支持+泛型参数约束决定了在编译时就可找到不符合参数类型要求的地方,这样就保证了编译时的类型安全,从而避免了运行时的类型转换错误。如下实例:
4. 泛型类与泛型方法
两者只是在声明强制类型支持与泛型参数约束的位置不同,一个在类后,一个在方法后。唯一的区别仅仅是作用域不同。例:
5. 泛型与集合
泛型之所以与集合经常一起用,是因为集合包含的往往是多个甚至是很多个对象,一旦涉及到阴式地装箱、拆箱操作,整个集合中所有对象都要走这个过程,这将很大的降低程序的性能。反之,如果运用泛型,将会避免阴式的拆装箱,当然也就大大提高了程序性能。当然也能起到保证编译时的类型安全,避免运行时的类型转换错误的作用。
所以集合操作主要是应用了泛型【作用二】中的“强类型支持”。
6. 总结
主要从字面和运用实例介绍了泛型的作用:
Ø 通过抽象参数类型,使得代码可以复用,程序更加灵活;
Ø 通过参数的“强类型支持”避免了隐式的装箱、拆箱,从而提高了程序的性能;
Ø 通过强类型支持+泛型参数约束,决定了在编译时就可找到不符合参数类型要求的地方,从而保证了编译时的类型安全,避免了运行时的类型转换错误。
- 【java 2】java泛型
- Java 泛型 Java generic
- Java Tutorials_Generics(java泛型)
- Java基础 Java 泛型
- java 泛型
- java泛型
- Java泛型
- Java泛型
- java泛型
- java泛型
- java泛型
- Java 泛型
- Java泛型
- Java 泛型
- JAVA 泛型
- java 泛型
- java泛型
- Java泛型
- 用POI创建Excel文件及下载
- STL之set的基本使用
- Android中多层动态嵌套布局的实现
- bzoj3713 [PA2014]Iloczyn
- 数据挖掘(hadoop的mapReduce技术概念)
- 【Java】泛型
- 小黑小波比.实现button关闭窗体
- PAYPAL,微软,苹果,脸书创始人创业观点的多元化
- Android使用DOM读取与解析XML格式数据
- gen_tcp 小程序
- errno的值的解释
- win7笔记本如何设置共享网络供手机WIFI上网
- Linux内核学习6:内存管理(2)-进程地址空间
- R.layout.simple_list_item_1