java泛型

回來補基礎,為以前偷的懶還債??
今天來撩一下泛型這個小寶寶,東西好像不多,嗯嗯往下走。

在開發(fā)過程中,泛型這個寶寶還是挺重要的,在面向對象編程及各種設計模式中有非常廣泛的應用。

泛型即是參數(shù)化類型,看個例子:

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
    }
image.png

哇哦,原來這就是泛型呀,嘻嘻嘻嘻,用了別人大半輩子卻不認識人家,有點可悲。

泛型有三種使用方式,泛型類、泛型接口、泛型方法。

上面那個List<T>應該就是泛型接口吧,猜的。。

泛型類

在類的聲明時指定參數(shù),即構成了泛型類,在使用類時傳入不同的類型即構建的實例也不同,使用這個類使用起來更加靈活,感覺好嗨哦,就像擁有了靈魂一般。

public class Demo1<T> {

    public T param;

    public Demo1(T param) {
        this.param = param;
        System.out.println(this.param);
    }

    public static void main(String[] args) {
        new Demo1<String>("妖艷賤貨");
        new Demo1<Integer>(0520);
        new Demo1<Boolean>(true);
    }

}

根據(jù)傳遞的類型不同,構建的實例也不同。


image.png

如果沒有泛型,我們想要達到上面的效果需要定義三個類,或者一個包含三個構造函數(shù),三個取值方法的類。(多敲一行代碼都不行)

泛型接口

泛型接口與泛型類基本一致,就照著泛型類搞。

interface Itf<T>{
    public T produce();
}

泛型方法

顧名思義就是把泛型加到了方法上

/*那段代碼*/
public class Demo1<T> {

    public T param;
    
    public Demo1(T param) {
        this.param = param;
        System.out.println(this.param);
    }
    
    public T a() {
        return param;
    }
    
    public <E> void a2(E e) {
        System.out.println(e);
    }
    
    public <T> T a3(T t) {
        return t;
    }
    
    public static void main(String[] args) {
        Demo1<String> d = new Demo1<String>("sss");
        System.out.println(d.a3(123));
        d.a2("aaa");
        System.out.println(d.a());
    }

}

首先泛型方法不像泛型類和泛型接口,使用時不需要傳遞類型,就是和可變參數(shù)一樣靈活的可變類型,a3()的T與類的T同名,方法使用的是本身的T,所以可以看到類的T傳的是String類型,而a3輸出的是整數(shù)。


image.png

泛型的使用

如何繼承一個泛型類
如果不傳入具體的類型,則子類也需要指定類型參數(shù),代碼如下:

class Son<T> extends Dad<T>{}

如果傳入具體參數(shù),則子類不需要指定類型參數(shù)

class Son extends Dad<String>{}

如何實現(xiàn)一個泛型接口

class Son <T> implements Dad<T>{
    @Override
    public T Son () {
        return null;
    }
}

調用一個泛型方法和調用普通方法一致,不論是實例方法還是靜態(tài)方法。我上面的那段代碼就有。

通配符?

?代表任意類型。

public void m3(List<?>list){
    for (Object o : list) {
        System.out.println(o);
    }
}

其參數(shù)類型是?,那么我們調用的時候就可以傳入任意類型的List,如下

str.m3(Arrays.asList(1,2,3));
str.m3(Arrays.asList("總有刁民","想害","朕"));

但是說實話,單獨一個?意義不大,因為大家可以看到,從集合中獲取到的對象的類型是Object 類型的,也就只有那幾個默認方法可調用,幾乎沒什么用。如果你想要使用傳入的類型那就需要強制類型轉換,這是我們接受不了的,不然使用泛型干毛。其真正強大之處是可以通過設置其上下限達到類型的靈活使用,且看下面分解重點內容。

通配符上界

通配符上界使用<? extends T>的格式,意思是需要一個T類型或者T類型的子類,一般T類型都是一個具體的類型,例如下面的代碼。

public void printIntValue(List<? extends Number> list) {  
    for (Number number : list) {  
        System.out.print(number.intValue()+" ");   
    }  
}

這個意義就非凡了,無論傳入的是何種類型的集合,我們都可以使用其父類的方法統(tǒng)一處理。

通配符下界

通配符下界使用<? super T>的格式,意思是需要一個T類型或者T類型的父類,一般T類型都是一個具體的類型,例如下面的代碼。

public void fillNumberList(List<? super Number> list) {  
    list.add(new Integer(0));  
    list.add(new Float(1.0));  
} 

至于什么時候使用通配符上界,什么時候使用下界,在《Effective Java》中有很好的指導意見:遵循PECS原則,即producer-extends,consumer-super. 換句話說,如果參數(shù)化類型表示一個生產者,就使用 <? extends T>;如果參數(shù)化類型表示一個消費者,就使用<? super T>。

泛型類中的靜態(tài)方法和靜態(tài)變量不可以使用泛型類所聲明的泛型類型參數(shù)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉載自這里,這哥們也是轉載但是沒注明....所以找不到原作者 1. 概述 泛型在java中有很重要的地位,在面向對...
    琴匣自鳴閱讀 1,360評論 0 14
  • 開發(fā)人員在使用泛型的時候,很容易根據(jù)自己的直覺而犯一些錯誤。比如一個方法如果接收List作為形式參數(shù),那么如果嘗試...
    時待吾閱讀 1,125評論 0 3
  • 參數(shù)類型的好處 在 Java 引入泛型之前,泛型程序設計是用繼承實現(xiàn)的。ArrayList 類只維護一個 Obje...
    杰哥長得帥閱讀 952評論 0 3
  • Java 泛型是 Java 5 引入的一個重要特性,相信大多數(shù) Java 開發(fā)者都對此不陌生,但是泛型背后的實現(xiàn)原...
    JohnnyShieh閱讀 2,150評論 6 37
  • 這是一個噙著淚的小男生。因為同桌一個小女生說要扣他的操行分,急得哭了。不僅哭了,還在生悶氣撕扯著自己的作業(yè)本。 看...
    梧桐瀟雨xt閱讀 184評論 0 1

友情鏈接更多精彩內容