泛型

1.不能创建参数化类型的数组

  原因:在虚拟机中,会把泛型类型还原到原始类型,从而导致能够通过数组存储检查,不过仍会导致一个类型错误,出于这个原因不允许创建参数化类型的数据;直白的说就是数据类型不安全,如果一定要实例化泛型类数组,可以使用new ArrayList<Pair<String>>()。

  原始类型:例如Pair<String>和Pair<Employee>的原始类型都是Pair类,在创建数组Pair<String> arr=new Pair<String>[10];之后,String和Employee类型的数据都可以存储,但在转化类型的时候就会报错。

2.不能实例化类型变量,但可以声明

  例如:new T(...)是不允许的,可以使用如下方式创建对象:

       public static <T> Pair<T> makePair(Class<T> c){

    try{return new Pair<>( c.newInstance(),c.newInstance());}

    catch(Exception e){ return null;}

  }

  通过反射调用Class.newInstance方法创建对象。

3.通配符类型"?"

  Pair<? extends Employee> 表示任何泛型类型,它的类型参数是Employee的子类。它可以安全地调用get访问器,不能安全的调用set访问器。

4.通配符的超类型限定

  Pair<? super Manager> 表示的任何泛型类型,它的类型参数是Manager的子类,它可以安全的调用set访问器,调用get访问器返回Object对象。

总结来说:

  • 频繁往外读取内容的,适合用上界Extends。
  • 经常往里插入的,适合用下界Super。

 

 去掉警告的标注

  ①@SuppressWarnings("unchecked")

  ②@SafeVarargs(Java SE 7)

  例子:@SafeVarargs

     public static <T> void AddAll(Collection<T>coll ,T... ts){

      //TODO

     }

      

 

posted @ 2018-08-14 15:41  YSP  阅读(235)  评论(0编辑  收藏  举报