泛型这一块我看的比较快,没有深究,书上这一章就有点难了,不太好理解
8.1 为什么要使用泛型程序设计
- 从Java1.0版发布以来,变化最大的就是泛型。使用泛型机制编写的程序代码要比那些杂乱的使用object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性
- 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。
- 在Java中增加泛型类之前,泛型程序设计是用继承实现的。但是有两个问题:
- 当获取一个值时必须进行强制类型转换
- 这里没有错误检查,可以向数组列表中添加任何类的对象
- 类型参数的魅力在于:使得程序具有更好的可读性和安全性
- JDK开发人员已经做出了很大的努力,为所有的集合类提供类类型参数!!!
8.2 定义简单泛型类
- 类型变量使用大写形式,且比较短,这是很常见的。在Java库中,使用变量E来表示集合的元素类型,K和V来表示关键字与值的类型。T表示“任意类型”
8.3 泛型方法
- 实际上,还可以定义一个带有类型参数的简单方法:
类型变量放在修饰符的后面,返回类型的前面。当调用一个泛型方法时,在方法名钱的尖括号中放入具体的类型:class ArrayAlg{ public static<T> T getMiddle(T...a) { return a[a.lengtyh / 2]; } }
String middle = ArrayAlg.<String>getMiddle("John", "Holk");
8.4 类型变量的限定
-
有时,类或方法需要对类型变量加以约束
class ArrayAlg{ public static<T> T min(T[] a) { if(a == null || a.length == 0) return null; T smallest = a[0]; for(int i = 1; i < a.length;i++) if(smallest.compareTo(a[i]) > 0) smallest = a[i] return smallest; } }
这里有·问题,解决问题的方法是实现Comparator接口
public static <T extends Comparator> T min(T[] a)...
-
一个类型变量或通配符可以有多个限定,例如:
T extends Comparator & Serializable
限定类型用&分割,逗号用来分割类型变量
-
在Java的继承中,可以根据需要拥有多个接口超类型,但限定类只能有一个。如果用一个类做限定,必须把这个类写在限定列表的第一个
8.5 泛型代码和虚拟机
- 原始类型用一个限定类型变量来替换,如果没有限定就替换成Object(类型擦除)
- 关于Java泛型转换的事实:
- 虚拟机中没有泛型,只有普通的类或方法
- 所有类型参数都用它们的限定类型替换
- 桥方法被合成来保持多态
- 为保持类型安全性,必要时加入强制类型转换
8.6 约束和局限性
- 不能用基本类型实例化类型参数
- 运行时类型查询只适用于原始类型
- 不能创建参数化类型的数组
- Varargs警告
- 不能实例化类型变量
- 不能构造泛型数组
- 泛型类的静态上下文中类型变量无效
- 不能抛出或捕获泛型类的实例
- 可以消除对受查异常的检查
- 注意擦除后的冲突