Java泛型的类型擦除
From: http://softlab.sdut.edu.cn/blog/subaochen/2017/01/generics-type-erasure/
Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。理解类型擦除对于用好泛型是很有帮助的,尤其是一些看起来“疑难杂症”的问题,弄明白了类型擦除也就迎刃而解了。 泛型的类型擦除原则是:- 消除类型参数声明,即删除<>及其包围的部分。
- 根据类型参数的上下界推断并替换所有的类型参数为原生态类型:如果类型参数是无限制通配符或没有上下界限定则替换为Object,如果存在上下界限定则根据子类替换原则取类型参数的最左边限定类型(即父类)。
- 为了保证类型安全,必要时插入强制类型转换代码。
- 自动产生“桥接方法”以保证擦除类型后的代码仍然具有泛型的“多态性”。
1 擦除类定义中的类型参数
1.1 无限制类型擦除
当类定义中的类型参数没有任何限制时,在类型擦除中直接被替换为Object,即形如<T>和<?>的类型参数都被替换为Object,参见 1。
1.2 有限制类型擦除
当类定义中的类型参数存在限制(上下界)时,在类型擦除中替换为类型参数的上界或者下界,比如形如<T extends Number>和<? extends Number>的类型参数被替换为Number,<? super Number>被替换为Object,参见 2。
2 擦除方法定义中的类型参数
擦除方法定义中的类型参数原则和擦除类定义中的类型参数是一样的,这里仅以擦除方法定义中的有限制类型参数为例,见 3。
3 桥接方法和泛型的多态
考虑下面的代码: public interface Info<T> { // just return var:-) T info(T var); } public class BridgeMethodTest implements Info<Integer> { @Override public Integer info(Integer var) { return var; } }1 2 3 4 5 6 7 8 9 10 | public interface Info<T> { // just return var:-) T info(T var); } public class BridgeMethodTest implements Info<Integer> { @Override public Integer info(Integer var) { return var; } } |
1 2 3 4 5 6 7 8 9 10 11 | public interface Info { // just return var Object info(Object var); } public class BridgeMethodTest implements Info { @Override public Integer info(Integer var) { return var; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.geocities.com/kpdus/jad.html // Decompiler options: packimports(3) // Source File Name: BridgeMethodTest.java public class BridgeMethodTest implements Info { public BridgeMethodTest() { } public Integer info(Integer integer) { return integer; } public volatile Object info(Object obj) { return info((Integer)obj); } } |
参考资料
- http://docs.oracle.com/javase/tutorial/java/generics/index.html
- http://docs.oracle.com/javase/tutorial/extra/generics/index.html

更多精彩