《Thanking in Java》15. 泛型

泛型實現(xiàn)了參數(shù)化類型的概念敌买,使代碼可以應(yīng)用于多種類型型宝。泛型術(shù)語的意思是適用于許多許多的類型燕差。泛型在編程語言中出現(xiàn)時潜叛,其最初的目的是希望類活方法能夠具備最廣泛的表達(dá)能力秽褒,通過解耦類或方法與所使用的類型之間的約束壶硅。

15.2 簡單泛型

return語句只允許返回單個對象,如果僅一次方法調(diào)用就能返回多個對象销斟,解決辦法就是創(chuàng)建一個對象庐椒,用它來只有想要返回的多個對象。通過使用泛型蚂踊,將一組對象打包存儲于其中的一個單一對象约谈,這個容器對象允許讀取其中元素,但是不允許向其中存放新的對象犁钟。

final聲明確實能夠保護(hù)public元素棱诱,在對象被構(gòu)造出來之后,聲明為final的元素便不能被再賦予其他值了涝动。

如果我們希望以此構(gòu)建一個可以應(yīng)用于各種類型的對象工具迈勋,就需要使用泛型。

15.3 泛型接口

泛型也可以應(yīng)用于接口醋粟。例如生成器靡菇,這是一種專門負(fù)責(zé)創(chuàng)建對象的類。實際上米愿,這是工廠方法設(shè)計模式的一種應(yīng)用厦凤。不過,當(dāng)使用生成器創(chuàng)建新的對象時育苟,它不需要任何參數(shù)较鼓,而工廠方法一般需要參數(shù)。

基本類型無法作為類型參數(shù)宙搬。

15.4 泛型方法

是否擁有泛型方法笨腥,與其所在的類是否是泛型沒有關(guān)系。

如果使用泛型方法可以取代整個類泛型化勇垛,那么就應(yīng)該只使用泛型方法脖母,因為它可以使事情更清楚明白。另外闲孤,對于一個static的方法而言谆级,無法訪問泛型類的類型參數(shù),所以讼积,如果static方法需要使用泛型能力肥照,就必須使其成為泛型方法。

當(dāng)使用泛型類時勤众,必須在創(chuàng)建對象的時候指定類型參數(shù)的值舆绎,而使用泛型方法時,通常不必指明參數(shù)類型们颜,因為編譯器會為我們找出具體的類型吕朵,這稱為類型參數(shù)推斷猎醇。因此,我們可以像調(diào)用普通方法一樣調(diào)用努溃,而且就好像是被無限次地重載過硫嘶。

15.5 匿名內(nèi)部類

class Customer {
    private static long counter = 1;
    private final long id = counter++;

    private Customer() {
    }

    public String toString() {
        return "Customer " + id;
    }

    public static Generator<Customer> generator() {
        return new Generator<Customer>() {
            public Customer next() {
                return new Customer();
            }
        };
    }
}

class Teller {
    private static long counter = 1;
    private final long id = counter++;

    private Teller() {
    }

    public String toString() {
        return "Teller " + id;
    }

    public static Generator<Teller> generator = new Generator<Teller>() {
        public Teller next() {
            return new Teller();
        }
    };
}

15.7 擦除的神秘之處

在泛型代碼內(nèi)部,無法獲得任何有關(guān)泛型參數(shù)類型的信息梧税。

java泛型是使用擦除來實現(xiàn)的沦疾,這意味著當(dāng)你在使用泛型時,任何具體的類型信息都被擦除了第队,你唯一知道的就是你在使用一個對象哮塞。因此List<String>和List<Integer>在運行時事實上是相同的類型。這兩種形式都被擦除成它們的原生類型斥铺,即List彻桃。

擦除主要的正當(dāng)理由是從非泛化代碼到泛化代碼的轉(zhuǎn)變過程,以及在不破壞現(xiàn)有類庫的情況下晾蜘,將泛型融入到j(luò)ava語言中邻眷。

不能創(chuàng)建泛型數(shù)組,一般的解決方案是在任何想要創(chuàng)建泛型數(shù)組的地方都是用ArrayList

15.9 邊界

邊界使得你可以在用于泛型的參數(shù)類型上設(shè)置限制條件剔交,其潛在的一個更重要的效果是可以按照自己的邊界類型來調(diào)用方法肆饶。

extends關(guān)鍵字在泛型邊界上下文環(huán)境中和在普通情況下所具有的意義是完全不同的。

15.10 通配符

數(shù)組類型賦值時岖常,不適用向上轉(zhuǎn)型驯镊,運行時期拋出異常。

數(shù)組在語言中是完全定義的竭鞍,因此可以內(nèi)建了編譯期和運行時的檢查板惑,但是在使用泛型時,編譯器和運行時系統(tǒng)都不知道想要類型做什么偎快,以及應(yīng)該采用什么樣的規(guī)則冯乘。

List<?>實際上表示“持有任何Object類型的原生List”,而List<?>表示“具有某種特定類型的非原生List晒夹,只是我們不知道那種類型是什么裆馒。”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丐怯,一起剝皮案震驚了整個濱河市喷好,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌读跷,老刑警劉巖梗搅,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡无切,警方通過查閱死者的電腦和手機蟀俊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來订雾,“玉大人,你說我怎么就攤上這事矛洞⊥莅ィ” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵沼本,是天一觀的道長噩峦。 經(jīng)常有香客問我,道長抽兆,這世上最難降的妖魔是什么识补? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮辫红,結(jié)果婚禮上凭涂,老公的妹妹穿的比我還像新娘。我一直安慰自己贴妻,他們只是感情好切油,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著名惩,像睡著了一般澎胡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娩鹉,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天攻谁,我揣著相機與錄音,去河邊找鬼弯予。 笑死戚宦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熙涤。 我是一名探鬼主播阁苞,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祠挫!你這毒婦竟也來了那槽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤等舔,失蹤者是張志新(化名)和其女友劉穎骚灸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慌植,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡甚牲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年义郑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈钙。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡非驮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雏赦,到底是詐尸還是另有隱情劫笙,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布星岗,位于F島的核電站填大,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俏橘。R本人自食惡果不足惜允华,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寥掐。 院中可真熱鬧靴寂,春花似錦、人聲如沸召耘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎茫。三九已至收壕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轨蛤,已是汗流浹背蜜宪。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祥山,地道東北人圃验。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像缝呕,于是被迫代替她去往敵國和親澳窑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 開發(fā)人員在使用泛型的時候供常,很容易根據(jù)自己的直覺而犯一些錯誤摊聋。比如一個方法如果接收List作為形式參數(shù),那么如果嘗試...
    時待吾閱讀 1,057評論 0 3
  • 泛型是Java 1.5引入的新特性栈暇。泛型的本質(zhì)是參數(shù)化類型麻裁,這種參數(shù)類型可以用在類、變量、接口和方法的創(chuàng)建中煎源,分別...
    何時不晚閱讀 3,039評論 0 2
  • 2.簡單泛型 -********Java泛型的核心概念:告訴編譯器想使用什么類型, 然后編譯器幫你處理一切細(xì)節(jié) 2...
    CodingHou閱讀 393評論 0 0
  • 【艾艾貼灸紅斑狼瘡的案例】這是免疫系統(tǒng)疾病色迂,重者容易引發(fā)尿毒癥,高血壓手销,高血鉀等并發(fā)癥歇僧。代理從2月底接觸艾艾貼到現(xiàn)...
    琰媽閱讀 817評論 0 0
  • 在WWDC 2016開發(fā)者大會上,蘋果宣布了一個最后期限:到2017年1月1日 App Store中的所有應(yīng)用都必...
    o翻滾的牛寶寶o閱讀 21,906評論 85 146