原文位址
首先我們先提出兩個問題:
- 什麼是泛型?
-
為什麼要使用泛型?
我們先來看看第一個問題什麼是泛型。如果你對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 = ; 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();
for (int i = ; i < list.size(); i++) {
// 當使用強轉是就會報ClassCastException
String object = (String) list.get(i);
System.out.println(object);
}
如果List使用的是Object而不是泛型的話,集合容器使用起來就沒那麼順手了。使用泛型能極大的提高我們程式的靈活性和拓展性,比如我寫的萬能擴充卡中 就使用了泛型來進行資料源的通用化處理。從上面兩個例子可以看出泛型的使用場景:當資料類型不确定時,或者說需要使用多個資料類型時,泛型則是不錯的選擇。
泛型的功能遠不止于此,有關擷取泛型的資料類型,泛型的邊界,泛型的通配符等問題,将會在下篇文章中詳解,歡迎繼續關注