终于我也开始记笔记了。????
以下是我看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核心技术卷一泛型程序设计