【Java基础】泛型方法

               

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


所以,使用泛型方法,返回值类型和至少一个参数类型应该是泛型,而且类型应该一致。以达到通过参数类型指定返回值类型的效果。


理解有误的话还请各位指出。


           

猜你喜欢

转载自blog.csdn.net/qq_44912644/article/details/89539910