JDK1.5中引入了泛型(Generic)机制。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
泛型方法典型用法, Collections类中的sort方法:
public static <T> void sort(List<T> list, Comparator<? super T> c)
这就是泛型方法。如果没有这个<T>的定义,在后面参数中使用泛型就会报错。
基本用法 :
public static <M> List<M> findAll(Class<M> m)
public static <M extends Model> List<M> findAll(Class<M> m)
一般来说编写Java泛型方法时,返回值类型和至少一个参数类型应该是泛型,而且类型应该是一致的,如果只有返回值类型或参数类型之一使用了泛型,这个泛型方法的使用就大大的限制了,基本限制到跟不用泛型一样的程度。
#1 比如返回值没有使用泛型:
public static <M> boolean save(M m)
public static <M extends Model> boolean save(M m)
此时完全可以不要泛型方法, 写成:
public static boolean save(Object m)
public static boolean save(Model m)
#2 比如参数不使用泛型
这种情况都不知道怎么写.. 更没意义
(以下写法都是错误的)(不使用泛型方法定义的泛型, 另外定义了一个)
public static <M> List<M> findAll(Class<?> m)
public static <M> List<M> findAll(Class<? extends Model> m)
public static <M> List<M> findAll(Class<? super Model> m)
编译可通过, 但参数与返回值非同一类型。(潜在错误,容易造成运行时异常)
顺便说一下;
“?”代表未知类型
extends关键字声明了类型的上界,表示参数的类型可能是所指定的类型,或者是此类型的子类
super关键字声明了类型的下界,表示参数的类型可能是所指定的类型,或者是此类型的父类型,直至Object
所以,使用泛型方法,返回值类型和至少一个参数类型应该是泛型,而且类型应该一致。以达到通过参数类型指定返回值类型的效果。
理解有误的话还请各位指出。