Java核心技术(第8版) – 读书笔记 – 第12章

1、JDK5之后支持了泛型,类似C++的模板。

2、一个简单的泛型类
一般通用类型表示如下:
(1)用E表示集合中的元素类型
(2)用K和V表示关键字与值类型
(3)用T、U、S表示任意类型

3、还可以只针对某个方法定义泛型方法:

对于T,还可以限定它必须继承自(或者实现自XX),例如用于比较时:

4、为了更好的支持泛型类,JDK5与之前的字节码文件不兼容!

5、在对泛型源代码翻译字节码时,要做类型擦除:擦除类型变量(T等),并用应该使用的类型替换。对于无类型(非T,已经定义的),用Object替换,然后在调用出口时再强制转换回原始的未限定类型。

6、泛型的限制:
(1)基本类型不能用于泛型类型,如int、double,请用对应的Integer/Double等替换。
(2)a instanceof Pair<T> 将始终为真! 表示测试T是否为任意类型T的Pair
(3) 不能在catch中使用类型T
(4)不能声明参数化类型的数组,即
Pair<String>  table  = new Pair<String>[0]; // 非法
如果一定要用,可以用ArrayList:
ArrayList<Pair<String>>  table = …. // 正确!
(5)不能直接实例化 T
T a = new T(); //非法
(6)还有其他一些情况,比较复杂,基本和擦除相关。

7、泛型类中T的继承关系:尽管Manager是Employee的子类,但是Pair<Manager>不是Pair<Employee>的子类。可以继承Pair实现XXPair,XXPair是Pair的子类,但XXPair<Manager>也不是Pair<Manager>的子类!

8、为了解决上述问题,引入了问号?
Pair<? extends Employee>,它的类型是任意Employee的子类。
Pair<? super Employee>,它的类型是任意Employee的超类。

本章完,读的很不细,该天重新来过。

 

Leave a Reply

Your email address will not be published.