以下是我看Java核心技术卷一中泛型程序设计一章摘抄下来的。
2011--10-31
(一)泛型的局限性:
①:不能用基本数据类型实例化类型参数 eg.ArrayList<int> ---> 被转化为 ArrayList<Integer>
②:运行是类型查询只使用于原始数据类型 eg.if(a instanceof Pair<String>) 和 if(a instanceof Pair<T>) 返回是一样的
--无论何时使用instance 或涉及泛型类型的强制类型转换表达式都会看到编译器警告。
--getClass方法总是返回原始类型 eg. 对于Pair<String> p1 = … 和 Pair<Integer> p2 = … 有
if(p1.getClass() == p2.getClass()) 返回true.
③:不能抛出也不能捕获泛型类实例
④:参数化类型的数组不合法 eg. Pair<String>[] table = new Pair<String>[10] //error
⑤:不能实例化类型变量 T t = new T() // error new T[]; //error T t = T.class.newInatance(); //error
解决方法:设计这样的API
public static <T> Pair<T> makePair(Class <T> cl){
try{
return new Pair<T>(cl.newInstance,cl.newInstance);}catch(Exception e){return null;}
}
然后就可以这样调用:Pari<String> p = Pair.makePair(String.class);
⑥:泛型类的静态上下文中的类型变量无效 eg. public static T get(); // error 即使类上面有T 改为 public static <T> T get();
(二)泛型中的通配符类型
①:Pair< ? extends Employee> eg. public static void print(Pair<? extends Employee>); 这样的一个方法参数可以是
Pair<Employee> 或者 Pair<Manager> //Manager 是 Employee 的子类。
②:? extends Employee get(); 是正确的,而void set(? extends Employee) 是错误的
(三)泛型中的通配符超类型限定
①:? super Employee 即 ? 是继承Employee
②:? super Employee get(); 是错误的,返回类型不能保证,只能赋给 Object ,而void set(? extends Employee) 是正确的.
③:? 不是类型变量,eg. ? t = p.get() //error. 但是可以使用通配符捕获
public static <T> void swap( Pair<?> p){
swapHelper(p);
}
public static <T> void swapHelper(Pair<T> p){
T t = p.getFirst();
p.setFirst(p.getSecond());
p.setSecond(t);
}
swapHelper()方法中的参数T捕获了通配符。
参考 java核心技术卷一泛型程序设计