类型擦除

类型擦除计算机程序设计时,在编译期明确去掉所编程序(某部分)的类型系统

操作语义不需要程序伴随着类型,这称作“类型擦除语义”(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.