(四)泛型的高級(jí)應(yīng)用

  1. 限制泛型

第三篇文章中的例子在上面的例子中,由于沒(méi)有限制class WithGenerics<T>類型持有者T的范圍筏养,實(shí)際上這里的限定類型相當(dāng)于Object丧慈,這和“Object泛型”實(shí)質(zhì)是一樣的孟辑。限制比如我們要限制T為集合接口類型山叮。只需要這么做:

class WithGenerics<T extends Collection>,這樣類中的泛型T只能是Collection接口的實(shí)現(xiàn)類博脑,傳入非Collection接口編譯會(huì)出錯(cuò)憎乙。

注意:<T extends Collection>這里的限定使用關(guān)鍵字extends,后面可以是類也可以是接口叉趣。但這里的extends已經(jīng)不是繼承的含義了泞边,應(yīng)該理解為T(mén)類型是實(shí)現(xiàn)Collection接口的類型,或者T是繼承了XX類的類型疗杉。

public class WithExtendGenerics<T extends Collection> {
    public WithExtendGenerics(T var) {
        this.var = var;
    }

    public Integer getSize() {
        return var.size();
    }

    public T getVar() {
        return var;
    }

    public void setVar(T var) {
        this.var = var;
    }

    public void showTypeName() {
        System.out.println(String.format("參數(shù)的實(shí)際類型:%s", var.getClass().getSimpleName()));
    }

    private T var;

    public void test(WithExtendGenerics<? extends Collection> var) {
        if (null == var) {
            return;
        }
        var.getSize();
    }

    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("123");
        WithExtendGenerics<ArrayList<String>> w1 = new WithExtendGenerics<>(arrayList);
        w1.showTypeName();
        ArrayList<String> var1 = w1.getVar();
        System.out.println(String.format("參數(shù)值是:%s size:{}", var1,w1.getSize()));

        WithExtendGenerics<? extends Collection> var = new WithExtendGenerics<>(null);
    }
}

  1. 多接口限制

雖然Java泛型簡(jiǎn)單的用 extends 統(tǒng)一的表示了原有的 extends 和 implements 的概念阵谚,但仍要遵循應(yīng)用的體系,Java 只能繼承一個(gè)類烟具,但可以實(shí)現(xiàn)多個(gè)接口梢什,所以你的某個(gè)類型需要用 extends 限定,且有多種類型的時(shí)候朝聋,只能存在一個(gè)是類嗡午,并且類寫(xiě)在第一位,接口列在后面冀痕,也就是:
<T extends SomeClass & interface1 & interface2 & interface3>
這里的例子僅演示了泛型方法的類型限定荔睹,對(duì)于泛型類中類型參數(shù)的限制用完全一樣的規(guī)則,只是加在類聲明的頭部言蛇,如:

public class Demo<T extends Comparable & Serializable> {
    // T類型就可以用Comparable聲明的方法和Seriablizable所擁有的特性了
}

  1. 通配符泛型

為了解決類型被限制死了不能動(dòng)態(tài)根據(jù)實(shí)例來(lái)確定的缺點(diǎn)僻他,引入了“通配符泛型”,針對(duì)上面的例子腊尚,使用通配泛型格式為<? extends Collection>吨拗,“?”代表未知類型婿斥,這個(gè)類型是實(shí)現(xiàn)Collection接口劝篷。那么上面實(shí)現(xiàn)的方式可以寫(xiě)為:

WithExtendGenerics<? extends Collection> var = null;
        var = new WithExtendGenerics<>(new ArrayList<String>());
  • 如果只指定了<?>,而沒(méi)有extends受扳,則默認(rèn)是允許Object及其下的任何Java類了携龟。也就是任意類兔跌。
  • 通配符泛型不單可以向上限制勘高,如<? extends Collection>,還可以向下限制,如<? super Double>华望,表示類型只能接受Double及其上層父類類型蕊蝗,如Number、Object類型的實(shí)例赖舟。
  • 泛型類定義可以有多個(gè)泛型參數(shù)蓬戚,中間用逗號(hào)隔開(kāi),還可以定義泛型接口宾抓,泛型方法子漩。這些都與泛型類中泛型的使用規(guī)則類似。

  1. 泛型方法

是否擁有泛型方法石洗,與其所在的類是否泛型沒(méi)有關(guān)系幢泼。要定義泛型方法,只需將泛型參數(shù)列表置于返回值前讲衫。

public <T> void testFun(T var) {
        System.out.println(String.format("參數(shù)的實(shí)際類型:%s", var.getClass().getSimpleName()));
    }

使用泛型方法時(shí)缕棵,不必指明參數(shù)類型,編譯器會(huì)自己找出具體的類型涉兽。泛型方法除了定義不同招驴,調(diào)用就像普通方法一樣。

參考資料:https://baike.baidu.com/item/java%E6%B3%9B%E5%9E%8B

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枷畏,一起剝皮案震驚了整個(gè)濱河市别厘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拥诡,老刑警劉巖丹允,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袋倔,居然都是意外死亡雕蔽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)宾娜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)批狐,“玉大人,你說(shuō)我怎么就攤上這事前塔∠В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵华弓,是天一觀的道長(zhǎng)食零。 經(jīng)常有香客問(wèn)我,道長(zhǎng)寂屏,這世上最難降的妖魔是什么贰谣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任娜搂,我火速辦了婚禮,結(jié)果婚禮上吱抚,老公的妹妹穿的比我還像新娘百宇。我一直安慰自己,他們只是感情好秘豹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布携御。 她就那樣靜靜地躺著,像睡著了一般既绕。 火紅的嫁衣襯著肌膚如雪啄刹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天凄贩,我揣著相機(jī)與錄音鸵膏,去河邊找鬼。 笑死怎炊,一個(gè)胖子當(dāng)著我的面吹牛谭企,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播评肆,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼债查,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瓜挽?” 一聲冷哼從身側(cè)響起盹廷,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎久橙,沒(méi)想到半個(gè)月后俄占,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淆衷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年缸榄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祝拯。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甚带,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佳头,到底是詐尸還是另有隱情鹰贵,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布康嘉,位于F島的核電站碉输,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏亭珍。R本人自食惡果不足惜敷钾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一枝哄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闰非,春花似錦膘格、人聲如沸峭范。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纱控。三九已至辆毡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甜害,已是汗流浹背舶掖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尔店,地道東北人眨攘。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嚣州,于是被迫代替她去往敵國(guó)和親鲫售。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 引言:泛型一直是困擾自己的一個(gè)難題该肴,但是泛型有時(shí)一個(gè)面試時(shí)老生常談的問(wèn)題情竹;今天作者就通過(guò)查閱相關(guān)資料簡(jiǎn)單談?wù)勛约簩?duì)...
    cp_insist閱讀 1,847評(píng)論 0 4
  • 前言 泛型(Generics)的型變是Java中比較難以理解和使用的部分秦效,“神秘”的通配符,讓我看了幾遍《Java...
    珞澤珈群閱讀 7,860評(píng)論 12 51
  • 泛型的好處 使用泛型的好處我覺(jué)得有兩點(diǎn):1:類型安全 2:減少類型強(qiáng)轉(zhuǎn) 下面通過(guò)一個(gè)例子說(shuō)明: 假設(shè)有一個(gè)Tes...
    德彪閱讀 1,128評(píng)論 0 0
  • 作為HR或者主管涎嚼,有沒(méi)有這樣一種經(jīng)歷阱州,招聘的員工工作后,發(fā)現(xiàn)員工的情況并非你當(dāng)初面試時(shí)覺(jué)得的那樣法梯?甚至有時(shí)候暗暗叫...
    海若音閱讀 410評(píng)論 0 1
  • 1 妹妹在兒童游樂(lè)場(chǎng)所打暑假工鹊汛,十七八歲的孩子蒲赂,初接觸社會(huì),就像突然入了森林的雛鳥(niǎo)刁憋,什么都覺(jué)得新奇滥嘴,什么事情都要回...
    貓八爺閱讀 878評(píng)論 10 8