加载中...

类型擦除(type erasure)是泛型的一种实现策略:类型参数仅在编译期用于类型检查,编译后被抹去,运行时不保留具体的泛型实参信息。
Java 5 引入泛型时为兼容旧字节码与旧类库选择了擦除方案:List<String> 与 List<Integer> 在运行时是同一个 List 类,类型参数被替换为边界类型(通常是 Object),必要处由编译器插入强制转换。由此带来的限制包括:不能写 new T()、不能用 instanceof 判断泛型实参、基本类型必须装箱、反射拿不到实参类型等。
与之相对的是具化(reification):C# 的 CLR 为每种值类型实参生成专门代码,运行时保留完整泛型信息;C++ 模板和 Rust 泛型则通过单态化为每个实例生成独立代码。
擦除以运行时表达力换取了迁移兼容性,是语言演化中权衡取舍的经典案例。

登录 后参与讨论
暂无讨论,来发表第一条评论吧