類型擦除

類型擦除計算機程序設計時,在編譯期明確去掉所編程序(某部分)的類型系統

操作語義不需要程序伴隨着類型,這稱作「類型擦除語義」(type-erasure semantics)。 類型擦除語義的一種可能是通過抽象原理英語Abstraction principle (computer programming),確保程序在運行時執行不依賴類型信息。

與之相對的是類型傳遞語義(type-passing semantics)。如通過具體化[1]。類型擦除的逆操作是類型推斷

Java實現

Java通過類型擦除的方式實現泛型

具體來說,Java編譯器會將類型參數替換為其上界(upper bound, 在Java中,即類型參數中extends子句的類型),如果上界沒有定義,則默認為Object。這樣,在編譯後就不會保留類型參數。同時為了保證類型安全,會插入顯式類型轉換;以及為了保證多態性,會生成橋接方法。因此,不同於C++的模板,Java通過類型擦除實現泛型,不會生成新的類。[2]

C++實現

  • 通過多態來擦除類型:把派生類型轉成基類型隱藏起來,通過基類的多態調用虛函數隱藏類的實現。
  • 通過模板來擦除類型:模板的參數類型本質上是把不同類型的共同行為進行了抽象。
  • 通過某種容器來擦除類型:如std::tuple
  • 通過某種通用類型來擦除類型:如boost.any
  • 通過閉包來擦除類型:如std::function、lambda函數等

C#實現

參見

參考文獻

  1. ^ Langer, Angelika. What is reification?. [2015-06-12]. (原始內容存檔於2021-04-22). 
  2. ^ 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.