类型擦除

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

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

参见

参考文献

  1. Langer, Angelika. . [2015-06-12]. (原始内容存档于2021-04-22).
  2. . docs.oracle.com. [2020-05-25]. (原始内容存档于2021-02-27).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.