泛型方法详解

来源:互联网 发布:python 匿名函数 编辑:程序博客网 时间:2024/06/08 06:19

泛型的类代表类的声明用到类型参数;泛型的方法代表方法的声明特征用到类型参数。

在方法的类型参数有几种不同的运用方式。

【1】使用定义在类声明中的类型参数

实例如下:

public class ArrayList<T> extends AbstractList<T>...{    public boolean add(T o){        //...    }    public T get(T o){        //...    }}

add方法返回boolean类型,get方法返回类型与类一致,参数类型均与类一致。


【2】使用未定义在类声明的类型参数

即,泛型方法拥有不同于类的类型。

实例1如下:

public <T extends Animal> void takeThing(ArrayList<T> list){    //...}

实例2如下:

public  <T> T get(T e){    //...}

实例一中,指明了T类型为Anamal子类,实例2未指明类型,即可以为任何一种类型!默认为Object。

实例3如下图所示:

这里写图片描述


调用泛型方法语法格式如下:

这里写图片描述

说明一下,定义泛型方法时,必须在返回值前边加一个<T>,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。

Class<T>的作用就是指明泛型的具体类型对应的CLASS类型,而Class<T>类型的变量c,可以用来创建泛型类的对象。上图示例中,参数Class<T>=User.class;

为什么要用变量c来创建对象呢?

既然是泛型方法,就代表着我们不知道具体的类型是什么,也不知道构造方法如何,因此没有办法去new一个对象,但可以利用变量c的newInstance方法去创建对象,也就是利用反射创建对象。

为什么要使用泛型方法呢?

因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。

PS:泛型接口和泛型抽象类同样不可以实例化。