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
所以,使用泛型方法,傳回值類型和至少一個參數類型應該是泛型,而且類型應該一致。以達到通過參數類型指定傳回值類型的效果。
理解有誤的話還請各位指出。