java泛型

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

在開發(fā)過程中,泛型這個(gè)寶寶還是挺重要的,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用。

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

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

哇哦,原來這就是泛型呀,嘻嘻嘻嘻,用了別人大半輩子卻不認(rèn)識(shí)人家,有點(diǎn)可悲。

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

上面那個(gè)List<T>應(yīng)該就是泛型接口吧,猜的。。

泛型類

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

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ù)傳遞的類型不同,構(gòu)建的實(shí)例也不同。


image.png

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

泛型接口

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

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í)不需要傳遞類型,就是和可變參數(shù)一樣靈活的可變類型,a3()的T與類的T同名,方法使用的是本身的T,所以可以看到類的T傳的是String類型,而a3輸出的是整數(shù)。


image.png

泛型的使用

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

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

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

class Son extends Dad<String>{}

如何實(shí)現(xiàn)一個(gè)泛型接口

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

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

通配符?

?代表任意類型。

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

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

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

但是說實(shí)話,單獨(dú)一個(gè)?意義不大,因?yàn)榇蠹铱梢钥吹?,從集合中獲取到的對(duì)象的類型是Object 類型的,也就只有那幾個(gè)默認(rèn)方法可調(diào)用,幾乎沒什么用。如果你想要使用傳入的類型那就需要強(qiáng)制類型轉(zhuǎn)換,這是我們接受不了的,不然使用泛型干毛。其真正強(qiáng)大之處是可以通過設(shè)置其上下限達(dá)到類型的靈活使用,且看下面分解重點(diǎn)內(nèi)容。

通配符上界

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

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

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

通配符下界

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

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

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

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

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

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容