泛型出現(xiàn)之前
沒有泛型的時候她混,只有所謂的原始類型饲漾。此時珍剑,所有的原始類型都通過字節(jié)碼文件類Class類進(jìn)行抽象。Class類的一個具體對象就代表一個指定的原始類型穆壕。
泛型出現(xiàn)之后
泛型出現(xiàn)之后待牵,擴充了數(shù)據(jù)類型。從只有原始類型擴充了參數(shù)化類型(ParameterizedType)喇勋、類型變量類型(TypeVariable)缨该、泛型限定的參數(shù)化類型 (含通配符+通配符限定表達(dá)式)(WildcardType)、泛型數(shù)組類型(GenericArrayType)川背。
與泛型有關(guān)的類型不能和原始類型統(tǒng)一到Class的原因
產(chǎn)生泛型擦除的原因
為了使用泛型的優(yōu)勢又不真正引入泛型贰拿,Java采用泛型擦除的機制來引入泛型。Java中的泛型僅僅是給編譯器javac使用的熄云,確保數(shù)據(jù)的安全性和免去強制類型轉(zhuǎn)換的麻煩膨更。但是,一旦編譯完成缴允,所有的和泛型有關(guān)的類型全部擦除荚守。
Class不能表達(dá)與泛型有關(guān)的類型
因此,與泛型有關(guān)的泛型實例(ParameterizedType)癌椿、類型變量(TypeVariable)健蕊、泛型參數(shù)表達(dá)式 (含通配符+通配符限定表達(dá)式)(WildcardType)、泛型數(shù)組(GenericArrayType)這些類型全部被打回原形踢俄,在字節(jié)碼文件中全部都是泛型被擦除后的原始類型,并不存在和自身類型一致的字節(jié)碼文件晴及。所以和泛型相關(guān)的新擴充進(jìn)來的類型不能被統(tǒng)一到Class類中都办。
與泛型有關(guān)的類型在Java中的表示
為了通過反射操作這些類型以迎合實際開發(fā)的需要,Java就新增了ParameterizedType虑稼,GenericArrayType琳钉,TypeVariable 和WildcardType幾種類型來代表不能被歸一到Class類中的類型但是又和原始類型齊名的類型。
Type的引入:統(tǒng)一與泛型有關(guān)的類型和原始類型Class
為了程序的擴展性蛛倦,最終引入了Type接口作為Class歌懒,ParameterizedType,GenericArrayType溯壶,ypeVariable和WildcardType這幾種類型的總的父接口及皂。這樣實現(xiàn)了Type類型參數(shù)可以接受以上五種子類的實參甫男,而以上五種類型的返回值可以用Type類型的變量來接收。
從上面看到验烧,Type的出現(xiàn)僅僅起到了通過多態(tài)來達(dá)到程序擴展性提高的作用板驳,沒有其他的作用。因此Type接口的源碼中沒有任何方法碍拆。