Java高級特性之泛型

jopen 8年前發布 | 18K 次閱讀 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而不是泛型的話,集合容器使用起來就沒那么順手了。使用泛型能極大的提高我們程序的靈活性和拓展性,比如我寫的萬能適配器中 就使用了泛型來進行數據源的通用化處理。從上面兩個例子可以看出泛型的使用場景:當數據類型不確定時,或者說需要使用多個數據類型時,泛型則是不錯的選擇。
泛型的功能遠不止于此,有關獲取泛型的數據類型,泛型的邊界,泛型的通配符等問題,將會在下篇帖子中詳解,歡迎繼續關注

來自: http://blog.csdn.net/soul_code/article/details/50442601

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!