泛型
是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。
格式
<引用数据类型>
好处
把运行时期的问题提前到了编译期间,避免了强制类型转换。
优化了程序设计,解决了黄色警告线。
术语
泛型的基本术语,以ArrayList<E>为例:<>念typeof
Arraylist<E>中的E称为类型参数变量
Array<Integer>中的Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<Integer>称为参数化的类型ParameterizedType
自定义泛型
泛型类
把泛型定义在类上
public class 类名<泛型类型1,...>
泛型方法
把泛型定义在方法上
public <泛型类型> 返回类型 方法名(泛型类型)
泛型接口
把泛型定义在接口上
public interface 接口名<泛型类型1,...>
类型通配符
使用泛型时,泛型类型须为引用类型,不能为基本数据类型,泛型如果明确写的时候,前后必须一致。
Collection<Object> c = new ArrayList<Object>();
但是,new出来的类泛型可以省略
ArrayList<String> a = new ArrayList();//为什么呢?高级程序员编写了一个带泛型的方法,低级程序员不会泛型,可是又想调用,所以就省略了。
而且,前面的类泛型也可以省略
ArrayList a = new ArrayList<String>();//为什么呢?泛型是JDK5出来的,5以前没有泛型,然后我们现在编写方法写上泛型,又想调用5以前的方法,所以就省略了。
泛型通配符<?>:任意类型,如果没有明确,那么就是Object以及任意的Java类了。
? extends E:向下限定,E及其子类。
? super E:向上限定,E及其父类。
大集合有小集合:ArrayList<ArrayList<Student>>
注意
泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。
但用编译器编译带有泛型的java程序后,生成的class文件中将不再带有泛型信息,以此使程序运行效率不受影响,这个过程称之为"擦除"。
也就是说,带泛型和不带泛型生成的class文件一样。