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的超类。
本章完,读的很不细,该天重新来过。