Java高階特性之泛型學習總結
首先我們先提出兩個問題:
- 什麼是泛型?
- 為什麼要使用泛型?
我們先來看看第一個問題什麼是泛型。如果你對Java三大特性中的多型性理解的比較透徹的話,泛型就比較好理解了。多型性表示一個物件具備多種狀態。比如說你自己,你首先是一個人,同時你在看這篇帖子說明你是一個程式設計師,下了班之後你可能有變成了禽獸。所以你具備這人形態,程式設計師形態,和獸形態,這就是多型,一種事物具備多種狀態!而泛型就更加純粹的多型,他可以是任何一種形態,俗稱變態(開個玩笑o(∩_∩)o)。泛型的意思就是可以表示任何一種形態,任何一種資料型別。這就好像情人節你女朋友送你的禮物一樣,你先拿到的是一個禮物包裝盒,而盒子裡面可能是一個錢包,也可能是一個高檔打火機,還有可能是一坨屎!盒子裡面有可能是任何一種事物,你對此完全不知道,你知道你會收到這樣一份禮物,而禮物具體是什麼,你全然不知。
public class GrilFriend<T> { private T t; public void buyGift(T t) { this.t = t; } public T getGift() { return t; } public static void main(String[] args) { GrilFriend<Shit> myGrilFriend = new GrilFriend<Shit>(); myGrilFriend.buyGift(new Shit("狗屎")); Shit gift = myGrilFriend.getGift(); System.out.println(gift.name); } } class Shit { final String name; public Shit(String name) { this.name = name; } }
這就是泛型,你永遠不知道你女朋友會送你什麼禮物,這裡的禮物可能是任何一種型別(她可能會真的送你一坨屎)
接下來我們來看我們為什麼要使用泛型 ,相信List集合容器,大家都用的滾瓜爛熟了,我們先來看下List的原始碼
public interface List<E> extends Collection<E> { public boolean add(E object); public boolean addAll(Collection<? extends E> collection); public E get(int location); }
我們只看這幾個我們常用的方法,我們知道List是一個容器,它就是使用了泛型,我們才可以用List來儲存任何一種資料型別,有的小夥伴就會說,那用頂級父類Object還不是一樣可以實現這樣的功能,程式碼如下:
public interface List extends Collection { public boolean add(Object object); public boolean addAll(Collection<? extends Object> collection); public Object get(int location); }
確實這樣也能實現多種資料的儲存,但是有一個很嚴重的缺陷,當我們用Object來接資料的時候,一旦資料儲存到容器中,容器就會忘記儲存的資料型別,因為只知道當前物件是Object型別,我們使用起來的程式碼就會變成這樣
List list = new ArrayList(); list.add("hhhh"); list.add("eeee"); list.add("wwww"); for (int i = 0; i < list.size(); i++) { // 每次取資料 都需要進行強轉操作 String object = (String) list.get(i); System.out.println(object); } List list2 = new ArrayList(); list2.add("hhhh"); list2.add("eeee"); list2.add("wwww"); //如果這裡不小心新增的多種資料型別,編譯器不會有任何提示資訊 list2.add(1); for (int i = 0; i < list.size(); i++) { // 當使用強轉是就會報ClassCastException String object = (String) list.get(i); System.out.println(object); }
如果List使用的是Object而不是泛型的話,集合容器使用起來就沒那麼順手了。使用泛型能極大的提高我們程式的靈活性和擴充性,比如我寫的萬能介面卡中 就使用了泛型來進行資料來源的通用化處理。從上面兩個例子可以看出泛型的使用場景:當資料型別不確定時,或者說需要使用多個資料型別時,泛型則是不錯的選擇。
泛型的功能遠不止於此,有關獲取泛型的資料型別,泛型的邊界,泛型的萬用字元等問題,將會在下篇帖子中詳解,歡迎繼續關注。
相關文章
- Java高階特性之反射學習總結Java反射
- Java高階特性—泛型Java泛型
- Java高階特性之列舉學習總結Java
- Java進階學習之集合與泛型(1)Java泛型
- Java高階特性泛型看這一篇就夠了Java泛型
- 學習Rust泛型與特性Rust泛型
- java基礎學習之十三:泛型Java泛型
- Java高階特性之集合Java
- java泛型學習(1)Java泛型
- (小白學JAVA之)Java高階特性知識點梳理Java
- Java 高階特性之 instanceofJava
- 集合框架-泛型高階之萬用字元框架泛型字元
- Java知識點總結(Java泛型)Java泛型
- java泛型之泛型方法。Java泛型
- 泛型總結泛型
- 【java學習之容器總結】Java
- Java學習之LinkedHashMap學習總結JavaHashMap
- java泛型之泛型陣列。Java泛型陣列
- Java初階段學習的複習總結Java
- JDK5.0新特性的學習--泛型(下)JDK泛型
- JDK5.0新特性的學習--泛型(上)JDK泛型
- java入門基礎學習----泛型Java泛型
- 重學Java之泛型的基本使用Java泛型
- Java泛型複習Java泛型
- oracle flashback特性學習總結Oracle
- Java隨筆-Java泛型的一點學習Java泛型
- c#進階之泛型C#泛型
- 關於Java泛型深入理解小總結Java泛型
- Java資料結構之Map學習總結Java資料結構
- Java資料結構之Set學習總結Java資料結構
- 面試總結——Java高階工程師面試Java工程師
- Java學習總結Java
- JAVASE之JAVA泛型篇Java泛型
- JAVA高階程式設計之hibernate框架學習二Java程式設計框架
- JAVA泛型使用練習2(自定義泛型使用)Java泛型
- Java高階特性增強-鎖Java
- 《Java 高階篇》八:新特性Java
- C#泛型學習C#泛型