首页 > 代码库 > Java泛型再学习
Java泛型再学习
泛型是对于数据的一种规范,他限定了类、容器、方法可以接受的参数类型,避免参数类型混乱。
一、基本泛型
泛型最常见的地方就是集合,如:
-- ArrayList<String> 表示这个集合中只能存放String类型的元素
-- HashMap<String, Object> 表示这个图中只能存放键为String类型,值为Object类型的元素
特别要注意的时,泛型只存在于编译阶段,在程序运行阶段,我们定义的泛型是并不存在的,这种方案叫“擦除”,示例:
1 public class GenericTest {2 3 public static void main(String[] args) {4 ArrayList<String> a = new ArrayList<String>();5 ArrayList<Integer> b = new ArrayList<Integer>();6 System.out.println(a.getClass() == b.getClass()); //true7 }8 9 }
从示例可以看出,虽然定义了两个泛型类型不同的ArrayList集合,但是他们同属于一份字节码,这就证明了泛型的存活阶段只存在于编译期。
二、泛型方法
Java泛型方法的概念是基于C++的模板函数出现的,但是由于JVM指令集的问题,导致Java并不能完全实现完全和C++模板方法一样的泛型方法,泛型方法的定义如下:
访问修饰符 定义泛型类型 返回值类型 方法名(参数列表...) {
//....
}
1 public class GenericTest {2 3 public <T> T add(T i, T j) {4 return null;5 }6 7 }
要说明的是,定义泛型类型不一定使用T,只是业界大家习惯于使用T而已,比如ArrayList<E>,就是用的E。泛型类型代表任意引用类型。
如上例,我们定义了一个泛型方法,在返回值T的前面使用<T>定义了这个方法要使用的泛型类型,然后传入两个为T类型的变量,对于该方法,可以执行以下调用:
-- add(1,2);
-- add(3.5,12);
-- add("abc",true);
-- add(12,"xyz");
可以看到,除了第一个调用传入的两个参数是同类型外,其他的调用传入的都是不同类型的参数。但是方法却可以正确执行,这就是类型推导。简单来讲,就是两个不同类型的数据进行运算时,运算结果的类型总是运算元素中最大的类型。即,int和float运算,结果是float类型,String和boolean运算,结果是String类型......
三、泛型类
泛型类在开发中就比较常用了,下面给出一个实际开发中要使用的分页工具类PageModel:
1 public class PageModel<T> { 2 3 private Integer pageNo; 4 5 private Integer pageSize; 6 7 private Integer totalRecords; 8 9 private List<T> records;10 11 //省略getter&setter方法12 }
在类名的后面限定泛型类型,那么在整个类中,就可以使用这个类型去进行变量、方法的限定了。
进行如下初始化:
1 PageModel<User> pageModel = new PageModel<User>();
此时,属性records所代表的集合中就只能存放User对象了,这就是泛型类的一个使用。说白了,泛型类,在类名后面定义的泛型类型对类本身没有什么用,这个类型只是用来限定类成员的。