泛型其实就是让编译器(javac)。编译时进行类型转化的。
可以用反射骗过编译器
ArrayList<Integer> collection=new ArrayList<Integer>();
collection.add("abc");
此时编译器将不能通过。其实编辑器估计都不能通过吧。
collection.getClass().getMethod("add",Object.class).invoke(collect,"abc");
此时已经将abc添加进去了
2.参数化类型不考虑类型参数的继承关系
Vector<String> v=new Vector<Object>();//错误!
Vector<Object> v=new Vector<String>();//错误!!
collectionPrint(new ArrayList<String>);//错误!不能调用 其实就是相当于:Collect<Object>=new ArrayList<String>
public void collectionPrint(Collect<Object> collect){}
可以用统配符解决以上问题,注意使用?号通配符时,主要用作引用,只能调用与参数无关的方法
3.创建数组实例时,数组的元素不能使用参数化的类型。
Vector<String> vList[]=new Vector<Object>()[10];//错误!!
4.限定通配符
限定通配符的上边界:Vector<? extends Number> Number或者是Number的子类都可以匹配
限定通配符的下边界: Vector<? super Number>Number或者是Number的父类
限定通配符总是包括自己。
5.泛型是个<T> 是个Object,必须是个引用类型,不能是基本类型。
可以定义异常类型的T但是不能catch。可以throw(T),或者声明throws T