首页 > 代码库 > 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对象了,这就是泛型类的一个使用。说白了,泛型类,在类名后面定义的泛型类型对类本身没有什么用,这个类型只是用来限定类成员的。