泛型擦除的問題

泛型的兼容性

因為泛型是在Java SE5的時候引入的,而為了兼容之前沒有泛型的代碼,而擦除是最好的兼容方法。
擦除的主要問題是將非泛化代碼從泛化代碼的的轉(zhuǎn)變過程,繼續(xù)使用,直至客戶端準備好用泛型重寫這些代碼。這個動機不會破壞現(xiàn)有的代碼。
擦除的代價也是顯著的,泛型不能顯示地引用運行時類型的操作之中,例如轉(zhuǎn)型,instanceofnew表達式,這是因為所有關(guān)于參數(shù)的類型信息都丟失了。
所以無論何時,當在編寫泛型代碼的時候,必須時刻提醒自己,只是看起來具有有關(guān)參數(shù)的類型信息而已。
如果編寫了以下的代碼段。

class Foo<T> {
    T var;
}

那么,看起來當在創(chuàng)建Foo的實例時。

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

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

擦除和遷移兼容性表明,使用泛型不是強制的。

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,但是沒有任何泛型參數(shù),但是編譯器沒有發(fā)出警告。而警告在set()被調(diào)用的時候才出現(xiàn)。
為了關(guān)閉警告,Java提供了一個注解(在Java SE5版本前不被支持)
@SuppressWarnings("unchecked")
需要注意的是,這個注解應(yīng)該盡可能地被放置在可以產(chǎn)生這類警告的方法之上,而不是整個類上。當要關(guān)閉警告的時候,最好盡量地"聚焦,這樣就不會過于寬泛地關(guān)閉警告,而導(dǎo)致意外地屏蔽掉真正的問題。
Derived3的錯誤意味著編譯器期待得到的是一個原生基類,而不是一個不確定類型的類。
當希望將類型參數(shù)不僅僅當做Object處理的時候,就需要付出額外的努力去管理邊界,并且與C++等語言獲得參數(shù)化類型相比,需要付出多得多的努力來獲得少得回報。這并不是說這些語言比Java更得心應(yīng)手,而是說它們的參數(shù)類型化機制比Java更加強大、更靈活。

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

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

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

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