類型擦除
類型擦除是電腦程式設計時,在編譯期明確去掉所編程式(某部分)的型別系統。
操作語意不需要程式伴隨著類型,這稱作「類型擦除語意」(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.