【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.    总结

  主要从字面和运用实例介绍了泛型的作用:

  Ø  通过抽象参数类型,使得代码可以复用,程序更加灵活

  Ø  通过参数的“强类型支持”避免了隐式的装箱、拆箱,从而提高了程序的性能

  Ø  通过强类型支持+泛型参数约束,决定了在编译时就可找到不符合参数类型要求的地方,从而保证了编译时的类型安全,避免了运行时的类型转换错误

0 0
原创粉丝点击