泛型
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
}