1. 解决元素存储的安全性问题
2. 解决获取数据元素时,需要类型强转的问题
3. 泛型,JDK1.5新加入的
4. 常用T表示 , T只能是类,不能用基本数据类型填充。(使用泛形时,泛形类型须为引用类型,不能是基本数据类型)
泛型的实例化:
一定要在类名后面指定类型参数的值(类型)。如:
List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();
5. 静态方法中不能使用类的泛型。
6. 如果泛型类是一个接口或抽象类,则不可创建泛型类的对象(这不是废话吗,接口类和抽象类都不能直接创建对象)
7. 不能在catch中使用泛型
8. 从泛型类派生子类,泛型类型需具体化(例如:在MVC 设计模式中,底层模板BaseAction,BaseService,BaseDao三个抽象泛型类模板,用于被继承)
9. 泛型不存在继承关系。
10.一个很有用的方法: void drawAll(List<? extends Shape> shapes){//..} 方法中的参数可以接收Shape 的子类
11. 一个典型的错误:
static void fromArrayToCollection(Object[] a,Collection<?> c){
for(Object o : a){
c.add(o);//编译错误
}
}
正确:(这样就能遍历任何任何集合)
static void fromArrayToCollection(T[] a,Collection<T> c){
for(Object o : a){
c.add(o);//正确
}
}
二、泛型-深入
注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译带有泛形的集合时,会去掉“类型”信息,使程序运行效率不受到影响,这个过程称之为“擦除”
由于编译生成的字节码会去掉泛型的类型信息,所以只要能跳过编译器(没有语法错误),就可以往某个泛型集合中加入其他类型的数据。使用反射测试结果。
以下是ppt笔记: