详细文章:http://qiemengdao.iteye.com/blog/1525624
1、初衷:取消强制类型转换,减少转换异常,引入了泛型编程
如ArrayList a = new ArrayList();
a.add(newInteger[0]);
Integer b = (Integer)a.iterator.next(); //此处就必须强制类型转换
改用泛型编程后
ArrayList<Integer> a = new ArraryList<Integer>();
a.add(newInteger[0]);
Integer b = a.iterator.next();//泛型编程后此处无需强制类型转换。
在ArryList的的源代码定义中可以看到,
public class ArrayList<E> extends AbstractList<E>
这里的<E>就用于定义ArrayList变量时指定类型参数,即:ArrayList<Integer>
可称ArrayList类为泛型类
2、 通配符 ?
我们需要知道的是 ArrayList<Object> a = new ArrayList<String>();这样的写法是错误的。
在过去的非泛型编程中,比如人类 作为超级父类,男人作为子类,这样定义是没有问题的,在泛型中不可以,Collection<?> a = new ArrayList<String>(),这样的做法也是错误的,因为通配符?表示该类型未知,既然是未知,那么加入任何类型对会报错,除null之外。因为null是任何类型的子类型。