-
原理
Java泛型是通過(guò)類型擦除來(lái)實(shí)現(xiàn)。
-
類型擦除的好處
-
運(yùn)行時(shí)內(nèi)存負(fù)擔(dān)小
諸如List<String>、List<Integer>等在運(yùn)行時(shí)只會(huì)存在List一個(gè)類型。
-
兼容性好
Java新增泛型(1.5)之后的版本可以兼容老版本的原始類型。
-
-
類型擦除的問(wèn)題
-
泛型參數(shù)不能使用基本類型
不能使用如List<int>的類型,只能使用List<Integer>等,存在裝箱和拆箱的開銷。
-
泛型類型無(wú)法用作方法重載
void foo(List<Integer> list)和void foo(List<String> list)的參數(shù)類型在編譯完成后都是List。
-
泛型類型無(wú)法當(dāng)作真實(shí)類型使用
<T> void foo(T t){ T instance = new T(); T[] arr = new T[1]; Class c = T.class; List<T> list = new ArrayList<>(); if(list instanceOf List<某類型>){} }如上這種是不可行的。
-
靜態(tài)方法無(wú)法引用類泛型參數(shù)
類的泛型參數(shù)只有類實(shí)例化的時(shí)候才知道是什么類型。
靜態(tài)方法若要使用泛型,一般在方法上聲明一個(gè)泛型類型,如
static <S> S foo(S s) {}。 -
運(yùn)行時(shí)類型強(qiáng)轉(zhuǎn)開銷
泛型出現(xiàn)(1.5)之前,手動(dòng)強(qiáng)轉(zhuǎn):
List strs = new ArrayList(); strs.add("str"); String val = (String)strs.get(0);泛型出現(xiàn)(1.5)之后,自動(dòng)強(qiáng)轉(zhuǎn):
原因:編譯完成后類型被擦除。
List<String> strs = new ArrayList(); strs.add("str"); String val = strs.get(0);
-
Java泛型實(shí)現(xiàn)機(jī)制
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 簡(jiǎn)介 泛型的意思就是參數(shù)化類型,通過(guò)使用參數(shù)化類型創(chuàng)建的接口、類、方法,可以指定所操作的數(shù)據(jù)類型。比如:可以使用參...
- 參考:java核心技術(shù) 一、Java泛型的實(shí)現(xiàn)方法:類型擦除 前面已經(jīng)說(shuō)了,Java的泛型是偽泛型。為什么說(shuō)Jav...
- (80)今天和姑娘一起制定了寒假計(jì)劃表,為了寒假計(jì)劃能順利進(jìn)行,我們把所有寒假要做的作業(yè)都列了出來(lái),然后按內(nèi)容分時(shí)...