类型擦除

类型擦除是计算机程序设计时，在编译期明确去掉所编程序（某部分）的类型系统。

操作语义不需要程序伴随着类型，这称作“类型擦除语义”（type-erasure semantics）。
类型擦除语义的一种可能是通过，确保程序在运行时执行不依赖类型信息。

与之相对的是类型传递语义（type-passing semantics）。如通过具体化。。类型擦除的逆操作是类型推断。

Java实现
Java通过类型擦除的方式实现泛型。

具体来说，Java编译器会将类型参数替换为其上界（upper bound, 在Java中，即类型参数中extends子句的类型），如果上界没有定义，则默认为Object。这样，在编译后就不会保留类型参数。同时为了保证类型安全，会插入显式类型转换；以及为了保证多态性，会生成桥接方法。因此，不同于C++的模板，Java通过类型擦除实现泛型，不会生成新的类。

C++实现
 通过多态来擦除类型：把派生类型转成基类型隐藏起来，通过基类的多态调用虚函数隐藏类的实现。 
 通过模板来擦除类型：模板的参数类型本质上是把不同类型的共同行为进行了抽象。
 通过某种容器来擦除类型：如std::tuple
 通过某种通用类型来擦除类型：如boost.any
 通过闭包来擦除类型：如std::function、lambda函数等

C#实现

参见
 
 类型多态

参考文献

 

类型论
C++