類型擦除
類型擦除是計算機程序設計時,在編譯期明確去掉所編程序(某部分)的類型系統。
操作語義不需要程序伴隨着類型,這稱作「類型擦除語義」(type-erasure semantics)。 類型擦除語義的一種可能是通過抽象原理,確保程序在運行時執行不依賴類型信息。
與之相對的是類型傳遞語義(type-passing semantics)。如通過具體化。[1]。類型擦除的逆操作是類型推斷。
Java實現
編輯Java通過類型擦除的方式實現泛型。
具體來說,Java編譯器會將類型參數替換為其上界(upper bound, 在Java中,即類型參數中extends子句的類型),如果上界沒有定義,則默認為Object。這樣,在編譯後就不會保留類型參數。同時為了保證類型安全,會插入顯式類型轉換;以及為了保證多態性,會生成橋接方法。因此,不同於C++的模板,Java通過類型擦除實現泛型,不會生成新的類。[2]
C++實現
編輯- 通過多態來擦除類型:把派生類型轉成基類型隱藏起來,通過基類的多態調用虛函數隱藏類的實現。
- 通過模板來擦除類型:模板的參數類型本質上是把不同類型的共同行為進行了抽象。
- 通過某種容器來擦除類型:如std::tuple
- 通過某種通用類型來擦除類型:如boost.any
- 通過閉包來擦除類型:如std::function、lambda函數等
C#實現
編輯參見
編輯參考文獻
編輯- ^ Langer, Angelika. What is reification?. [2015-06-12]. (原始內容存檔於2021-04-22).
- ^ Type Erasure (The Java™ Tutorials > Learning the Java Language > Generics (Updated)). docs.oracle.com. [2020-05-25]. (原始內容存檔於2021-02-27).
- Crary, Karl; Weirich, Stephanie; Morrisett, Greg. Intensional Polymorphism in Type-Erasure Semantics. Journal of Functional Programming. 2002, 12 (6): 567–600. doi:10.1017/S0956796801004282.