【Java基礎】泛型方法

來源:互聯網
上載者:User

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


所以,使用泛型方法,傳回值類型和至少一個參數類型應該是泛型,而且類型應該一致。以達到通過參數類型指定傳回值類型的效果。


理解有誤的話還請各位指出。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.