Java 核心机制
动态绑定与静态绑定
特性 | 动态绑定 | 静态绑定 |
---|---|---|
定义 | 在运行时确定调用的方法 | 在编译时确定调用的方法 |
时机 | 运行时 | 编译时 |
应用 | 方法覆盖(override) | 方法重载(overload)、私有方法、静态方法、final 方法 |
关键字 | 无需特殊关键字 | static、private、final |
效率 | 相对较低 | 相对较高 |
多态性 | 支持 | 不支持 |
实现方式 | 通过虚方法表 | 直接调用 |
示例 | 子类重写父类方法 | 构造方法、静态方法调用 |
泛型擦拭
Java 编译器在编译泛型代码时,会移除所有泛型类型参数 ,并将它们替换为:
- 如果有上界(如
<T extends Number>
),则替换为上界类型(如 Number); - 如果没有上界(如
<T>
),则替换为 Object。
泛型擦拭机制主要做到以下三件事情:
类型参数替换 - 将泛型类型参数替换为原始类型(擦除类型变量,替换为界限类型或 Object)
类型转换插入 - 在必要的位置自动插入类型转换代码,保证类型安全
桥接方法生成 - 创建桥接方法以保持多态性,解决方法签名不一致的问题
这些实现方式保证了 Java 泛型的向后兼容性,但也带来了类型信息在运行时不可用等局限性。
NOTE
对于不同泛型参数的类得到的 class 对象相同