1、JDK5之后支持了泛型,类似C++的模板。
ArrayList<String> list = new ArrayList<String>();
2、一个简单的泛型类
一般通用类型表示如下:
(1)用E表示集合中的元素类型
(2)用K和V表示关键字与值类型
(3)用T、U、S表示任意类型
public class Pair<T, U> { public Pair() { } public Pair(T first, U second) { this.first = first; this.second = second; } public T getFirst() { return first; } public U getSecond() { return second; } public void setFirst(T newFirst) { this.first = newFirst; } public void setSecond(U newSecond) { second = newSecond; } private T first = null; private U second = null; public static void main(String [] args) { //泛型中,int等基础类型不能用,需要改用Integer等包装类 Pair<String, Integer> pair1 = new Pair<String, Integer>(); pair1.setFirst(new String("first")); pair1.setSecond(111); Pair<Integer, Double> pair2 = new Pair<Integer, Double>(); pair2.setFirst(222); pair2.setSecond(1.1); System.out.println("First:"+pair1.getFirst()+"\t"+pair1.getSecond()); System.out.println("Second:"+pair2.getFirst()+"\t"+pair2.getSecond()); } }
3、还可以只针对某个方法定义泛型方法:
class ArrayArg { public static <T> T getMiddle(T[] arr) { return arr[arr.length / 2]; } }
对于T,还可以限定它必须继承自(或者实现自XX),例如用于比较时:
public class ArrayArg { //尽管Comparable是接口,但依然要用extends public static <T extends Comparable> T min(T[] arr) { T min = arr[0]; for(int i=1; i<arr.length; i++) { if(arr[i].compareTo(min)<0) { min = arr[i]; } } return min; } public static void main(String [] args) { Integer [] a = {1,2,3,4,5}; Integer min = ArrayArg.min(a); System.out.println(min); } }
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的超类。
本章完,读的很不细,该天重新来过。