`
zhenzxie
  • 浏览: 67032 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java学习记录

    博客分类:
  • Code
阅读更多

以下是我看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核心技术卷一泛型程序设计

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics