目录
1 类型擦除
于Java的设计是受C++所启发,所以泛型的实现也是参考了C++。但是,Java泛型是通过类型擦除实现的。
泛型类型参数会被擦除为其第⼀个边界(多重边界也是可以的),编译器实际上会将类型参数替换为其被擦除后的类型(这也说明了类型擦除是在编译时进行的(而不是运行时))。
类型擦除的原因:
C++是不需要“类型擦除”的,“类型擦除”也不是Java的语言特性,即不是一个优势,相反,它给编程带来了麻烦,它降低了泛型的“泛化性”。那么为什么还要有“类型擦除”呢?
是为了 迁移的兼容性 , 充当从⾮泛型代码过渡到泛型化代码的中间过程。
因为泛型并不是Java与⽣俱来的特性,而是后面添加进来的,但是添加进来时,已经有很多的java组件、java库了,都没有使用泛型,所以为了兼容旧代码,目前最好的办法就是使用“类型擦除”。即使旧组件旧库都要升级成有泛型的版本,但是大家不可能约定好了同一时间升级,总有先有后,所以还是要考虑兼容性。