泛型擦除的問(wèn)題

泛型的兼容性

因?yàn)榉盒褪窃贘ava SE5的時(shí)候引入的测垛,而為了兼容之前沒(méi)有泛型的代碼坟奥,而擦除是最好的兼容方法蜈抓。
擦除的主要問(wèn)題是將非泛化代碼從泛化代碼的的轉(zhuǎn)變過(guò)程,繼續(xù)使用跋破,直至客戶端準(zhǔn)備好用泛型重寫這些代碼簸淀。這個(gè)動(dòng)機(jī)不會(huì)破壞現(xiàn)有的代碼。
擦除的代價(jià)也是顯著的幔烛,泛型不能顯示地引用運(yùn)行時(shí)類型的操作之中啃擦,例如轉(zhuǎn)型,instanceofnew表達(dá)式饿悬,這是因?yàn)樗嘘P(guān)于參數(shù)的類型信息都丟失了令蛉。
所以無(wú)論何時(shí),當(dāng)在編寫泛型代碼的時(shí)候狡恬,必須時(shí)刻提醒自己珠叔,只是看起來(lái)具有有關(guān)參數(shù)的類型信息而已。
如果編寫了以下的代碼段弟劲。

class Foo<T> {
    T var;
}

那么祷安,看起來(lái)當(dāng)在創(chuàng)建Foo的實(shí)例時(shí)。

Foo<Cat> f = new Foo<Cat>();

class Foo中的代碼應(yīng)該知道現(xiàn)在工作于Cat之上兔乞,盡管如此汇鞭,在編寫代碼的時(shí)候凉唐,就必須強(qiáng)烈地知道var只是一個(gè)Object類型。

擦除和遷移兼容性表明霍骄,使用泛型不是強(qiáng)制的台囱。

class GenericBase<T> {
    private T element;

    public T getElement() {
        return element;
    }

    public void setElement(T element) {
        this.element = element;
    }
}

class Derived1<T> extends GenericBase<T> {
}

class Derived2 extends GenericBase {
}

//class Derived3 extends GenericBase<?> {
    // Strange error
//}

public class ErasureAndInheritance {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        Derived2 d2 = new Derived2();
        Object obj = d2.getElement();
        d2.setElement(obj);// warning here
    }
}

上面的代碼中,Derived2繼承了GenericBase读整,但是沒(méi)有任何泛型參數(shù)簿训,但是編譯器沒(méi)有發(fā)出警告。而警告在set()被調(diào)用的時(shí)候才出現(xiàn)米间。
為了關(guān)閉警告强品,Java提供了一個(gè)注解(在Java SE5版本前不被支持)
@SuppressWarnings("unchecked")
需要注意的是,這個(gè)注解應(yīng)該盡可能地被放置在可以產(chǎn)生這類警告的方法之上屈糊,而不是整個(gè)類上的榛。當(dāng)要關(guān)閉警告的時(shí)候,最好盡量地"聚焦逻锐,這樣就不會(huì)過(guò)于寬泛地關(guān)閉警告困曙,而導(dǎo)致意外地屏蔽掉真正的問(wèn)題。
Derived3的錯(cuò)誤意味著編譯器期待得到的是一個(gè)原生基類谦去,而不是一個(gè)不確定類型的類。
當(dāng)希望將類型參數(shù)不僅僅當(dāng)做Object處理的時(shí)候蹦哼,就需要付出額外的努力去管理邊界鳄哭,并且與C++等語(yǔ)言獲得參數(shù)化類型相比,需要付出多得多的努力來(lái)獲得少得回報(bào)纲熏。這并不是說(shuō)這些語(yǔ)言比Java更得心應(yīng)手妆丘,而是說(shuō)它們的參數(shù)類型化機(jī)制比Java更加強(qiáng)大、更靈活局劲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勺拣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鱼填,更是在濱河造成了極大的恐慌药有,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苹丸,死亡現(xiàn)場(chǎng)離奇詭異愤惰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赘理,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門宦言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人商模,你說(shuō)我怎么就攤上這事奠旺≈├剑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵响疚,是天一觀的道長(zhǎng)鄙信。 經(jīng)常有香客問(wèn)我,道長(zhǎng)稽寒,這世上最難降的妖魔是什么扮碧? 我笑而不...
    開(kāi)封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮杏糙,結(jié)果婚禮上慎王,老公的妹妹穿的比我還像新娘。我一直安慰自己宏侍,他們只是感情好赖淤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谅河,像睡著了一般咱旱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绷耍,一...
    開(kāi)封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天吐限,我揣著相機(jī)與錄音,去河邊找鬼褂始。 笑死诸典,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崎苗。 我是一名探鬼主播狐粱,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胆数!你這毒婦竟也來(lái)了肌蜻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤必尼,失蹤者是張志新(化名)和其女友劉穎蒋搜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體胰伍,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿诞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骂租。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祷杈。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渗饮,靈堂內(nèi)的尸體忽然破棺而出但汞,到底是詐尸還是另有隱情宿刮,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布私蕾,位于F島的核電站僵缺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踩叭。R本人自食惡果不足惜磕潮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望容贝。 院中可真熱鬧自脯,春花似錦、人聲如沸斤富。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)满力。三九已至焕参,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間油额,已是汗流浹背叠纷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留潦嘶,地道東北人讲岁。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像衬以,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子校摩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 文章作者:Tyan博客:noahsnail.com 1. 什么是泛型 Java泛型(Generics)是JDK 5...
    SnailTyan閱讀 772評(píng)論 0 3
  • 2.簡(jiǎn)單泛型 -********Java泛型的核心概念:告訴編譯器想使用什么類型, 然后編譯器幫你處理一切細(xì)節(jié) 2...
    CodingHou閱讀 389評(píng)論 0 0
  • 總不想踩睬空間看峻,只因我愛(ài)博客很深沉。其實(shí)人生處處都是景衙吩,何苦費(fèi)心耗時(shí)漫步徜祥互妓?讓有限的年華創(chuàng)造不一般的信仰。我在坤塞,...
    那山那水那一片天閱讀 162評(píng)論 0 1
  • 媽栽完樹(shù)冯勉,說(shuō):“我腰痛,要不就不叫你澆水了摹芙∽普”我喊了一聲“媽……!”沒(méi)應(yīng)聲浮禾。 我醒了交胚,...
    胡長(zhǎng)溪閱讀 182評(píng)論 0 0
  • 2012年蝴簇,11月6日杯活。據(jù)說(shuō)是你19的最后一個(gè)晚上,然后用最后的十幾分鐘碎碎念熬词。 用了一年多的時(shí)間旁钧,經(jīng)營(yíng)一段在男生...
    充實(shí)感閱讀 389評(píng)論 0 0