类型擦除
类型擦除是计算机程序设计时,在编译期明确去掉所编程序(某部分)的类型系统。
操作语义不需要程序伴随着类型,这称作“类型擦除语义”(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#实现
参见
- Java的类型擦除
- 类型多态
参考文献
- ^ 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.