Type及其子接口的來歷

泛型出現之前

沒有泛型的時候,只有所謂的原始類型。此時,所有的原始類型都通過字節碼文件類Class類進行抽象。Class類的一個具體對象就代表一個指定的原始類型。

泛型出現之后

泛型出現之后,擴充了數據類型。從只有原始類型擴充了參數化類型(ParameterizedType)、類型變量類型(TypeVariable)、泛型限定的參數化類型 (含通配符+通配符限定表達式)(WildcardType)、泛型數組類型(GenericArrayType)。

與泛型有關的類型不能和原始類型統一到Class的原因

產生泛型擦除的原因

為了使用泛型的優勢又不真正引入泛型,Java采用泛型擦除的機制來引入泛型。Java中的泛型僅僅是給編譯器javac使用的,確保數據的安全性和免去強制類型轉換的麻煩。但是,一旦編譯完成,所有的和泛型有關的類型全部擦除。

Class不能表達與泛型有關的類型

因此,與泛型有關的泛型實例(ParameterizedType)、類型變量(TypeVariable)、泛型參數表達式 (含通配符+通配符限定表達式)(WildcardType)、泛型數組(GenericArrayType)這些類型全部被打回原形,在字節碼文件中全部都是泛型被擦除后的原始類型,并不存在和自身類型一致的字節碼文件。所以和泛型相關的新擴充進來的類型不能被統一到Class類中。

與泛型有關的類型在Java中的表示

為了通過反射操作這些類型以迎合實際開發的需要,Java就新增了ParameterizedType,GenericArrayType,TypeVariable 和WildcardType幾種類型來代表不能被歸一到Class類中的類型但是又和原始類型齊名的類型。

Type的引入:統一與泛型有關的類型和原始類型Class

為了程序的擴展性,最終引入了Type接口作為Class,ParameterizedType,GenericArrayType,ypeVariable和WildcardType這幾種類型的總的父接口。這樣實現了Type類型參數可以接受以上五種子類的實參,而以上五種類型的返回值可以用Type類型的變量來接收。

從上面看到,Type的出現僅僅起到了通過多態來達到程序擴展性提高的作用,沒有其他的作用。因此Type接口的源碼中沒有任何方法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容