重讀《深入理解Java虛擬機》六、Java泛型 VS C#泛型 (偽泛型 VS 真泛型)


一、泛型的本質

泛型是參數化類型的應用,操作的數據類型不限定於特定類型,可以根據實際需要設置不同的數據類型,以實現代碼復用。

二、Java泛型

Java 泛型是Java1.5新增的特性,JVM並不支持。

實現原理:Java源代碼里面類型提供實現泛型功能,而編譯后Class文件類型就變成原生類型(即類型被擦除掉),而在引用處插入強制類型轉換以實現JVM對泛型的支持。本質是Java泛型只是Java提供的一個語法糖,底層

的JVM並不提供支持,Java中的泛型屬於偽泛型。

但是編譯后的字節碼通過反射后還是可以獲取到泛型的真實類型信息,因為泛型擦除並沒有把保存泛型元數據擦除掉。

 

三、C#泛型

C# 泛型是2.0C#和CLR中新增的特性,CLR支持。

實現原理:C#無論語言層面還是CLR都提供對泛型的支持,所以C#泛型編譯后MSIL泛型都是切實存在的,類型不沒有變成原生類型,而是通過類型膨脹實現,在運行期生成,自己的虛方法表和類型數據.C#泛型屬於真泛型

 

四、小結

Java泛型只是語言層面上的一顆的語法糖以便於程序的開發,而C#泛型是在底層CLR就開始支持,通過類型膨脹實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM