一乱顾、泛型接口:
二、泛型方法
原則上宫静,能夠使用泛型方法的時(shí)候就盡量避免使用泛型類走净,這會(huì)使你的代碼看上去更加清楚。另外孤里,如果 static 方法需要使用泛型伏伯,只能使用泛型方法。泛型方法的使用方法就是將泛型參數(shù)置于返回值之前:
三捌袜、泛型擦除
1.擦除
在泛型代碼內(nèi)部说搅,無(wú)法獲取任何有關(guān)泛型參數(shù)的信息,比如你無(wú)法知道你的參數(shù)類型有那些成員和構(gòu)造函數(shù)等虏等。只能在靜態(tài)類型檢查期間感覺(jué)到泛型類型的存在弄唧,而在運(yùn)行時(shí),所有的泛型類型都被替換為上界類型霍衫。例如 List 擦除為 List候引,所有 T 都被替換為 Object。(如下)
2.擦除痕跡
JDK5 之后敦跌,字節(jié)碼中雖然進(jìn)行了類型擦除澄干,但還保留了類型參數(shù)的信息,只是這里保留的是源碼里寫(xiě)的類型參數(shù)信息柠傍,例如你用的保留的就是 T麸俘,并不是保留運(yùn)行時(shí)的實(shí)際類型。Java 的泛型規(guī)律是:①位于聲明一側(cè)携兵,源碼里寫(xiě)了什么運(yùn)行時(shí)就能看到什么疾掰。②位于使用一側(cè),源碼里寫(xiě)了什么運(yùn)行時(shí)都丟失了徐紧。所謂聲明一側(cè)包括静檬,泛型類型(泛型類與泛型接口)聲明、帶有泛型參數(shù)的方法和域的聲明并级,這些信息在 class 文件中都有保留拂檩。
3、擦除代價(jià)
①不能在靜態(tài)成員中引用封閉類型參數(shù)嘲碧,在對(duì)象沒(méi)有創(chuàng)建的時(shí)候稻励,我們并不能確定 T 的類型,因此類的泛型類型參數(shù)不能作用與靜態(tài)成員。
②泛型的類型不能是基本類型望抽,泛型參數(shù)編譯后都被擦除為 Object加矛,而 Object 是不能存儲(chǔ)基本類型?int, double, float?等值的
③無(wú)法對(duì)類型參數(shù)使用 instanceof:由于泛型參數(shù)類型在運(yùn)行時(shí)都被擦除為 Object,泛型類型都被擦除為原始類煤篙,因此?obj instanceof T?和?obj instanceof ArrayList, 這種使用方式都會(huì)導(dǎo)致編譯不通過(guò)
④?不能直接使用 new 實(shí)例化類型參數(shù)
⑤不能同時(shí)繼承同一個(gè)泛型接口的兩個(gè)變種
⑥方法重載參數(shù)列表唯一
⑦無(wú)法使用泛型數(shù)組