跳至內容

類型擦除

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

類型擦除電腦程式設計時,在編譯期明確去掉所編程式(某部分)的型別系統

操作語意不需要程式伴隨着類型,這稱作「類型擦除語意」(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.