Java学习-泛型
文章目录
体验泛型
在Jdk1.5之后,定义集合时需要你明确集合中要装哪种类型的数据,无法加入指定类型之外的数据。
1 | ArrayList<Integer> arr1 = new ArrayList<Integer>(); |
什么是泛型
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序的非法输入。
需要注意的是:编译器编译带类型参数的集合时会出掉“类型”信息,使程序运行的效率不受影响。对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译器生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往泛型集合中加入其它类型的数据。
举例,用泛型得到集合,再调用其add方法
1 | ArrayList<Integer> arr1 = new ArrayList<Integer>(); |
了解泛型
ArrayList
整个类型被称为ArrayList
ArrayList
ArrayList
Integer为实际类型参数
参数化类型可以引用一个原始类型的对象:
1 | Collection<String> c = new Vector(); |
原始类型可以引用一个参数化类型的对象:
1 | Collection c = new Vector<String>(); |
参数化类型不考虑类型参数之间的继承关系:
1 | Vector<Object> v = new Vector<String>(); |
以上的定义是错误的!
泛型的通配符
Collection<?>可以匹配任何参数类型,但具体匹配的是什么类型只有以后才知道。通配符定义的变量主要做引用,可以调用与参数无关的方法,不能调用与参数有关的方法。
举例:
1 | public static void printCollection(Collection<?> cols){ |
泛型集合的应用案例
1 | Map<String, Integer> maps = new HashMap<String, Integer>(); |
自定义泛型方法
例1
1 | public <T> void swap(T[],int i,int j){ |
例2:将Object转成自定义返回类型
1 | public <T> T autoConvert(Object obj){ |
自定义泛型类的应用
如果一个类的实例对象中多处都要用到同一个泛型参数,即这些地方引用的泛型类型保持同一个实际类型时,这时候就要采用泛型类型的方法进行定义,也就是类姐的泛型,语法格式如下:
1 | public class GenericDao<T>{ |
使用如下代码进行方法调用:
1 | GenericDao<Person> dao = new GenericDao<Person>(); |