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

泛型的兼容性

因?yàn)榉盒褪窃贘ava SE5的時(shí)候引入的,而為了兼容之前沒(méi)有泛型的代碼,而擦除是最好的兼容方法。
擦除的主要問(wèn)題是將非泛化代碼從泛化代碼的的轉(zhuǎn)變過(guò)程,繼續(xù)使用,直至客戶端準(zhǔn)備好用泛型重寫(xiě)這些代碼。這個(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)在編寫(xiě)泛型代碼的時(shí)候,必須時(shí)刻提醒自己,只是看起來(lái)具有有關(guān)參數(shù)的類型信息而已。
如果編寫(xiě)了以下的代碼段。

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之上,盡管如此,在編寫(xiě)代碼的時(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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,986評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,204評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,964評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,354評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,554評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,918評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,093評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,342評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,755評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,009評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,839評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,107評(píng)論 2 375

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

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