桥接方法是编译器为解决泛型擦除导致的重写签名断裂而自动生成的acc_bridge|acc_synthetic方法,其签名与父类/接口擦除后一致,内部仅做类型转换并转发调用,确保jvm按descriptor正确分派、维持多态与动态绑定。

桥接方法通过在字节码层面补全因类型擦除断裂的重写关系,让JVM能按 descriptor 正确匹配并分派调用,从而保障泛型继承或接口实现时的多态与动态绑定不被破坏。
解决签名断裂:让JVM认为“确实重写了”
Java泛型在编译后被擦除,例如接口 Comparable
编译器此时生成桥接方法:
- 签名与父类/接口擦除后完全一致:public int compareTo(Object o)
- 方法体只做一件事:return compareTo((Integer) o);
- 该方法被标记为 ACC_BRIDGE | ACC_SYNTHETIC,不可见于源码
支撑动态绑定:确保父类引用调用落到子类逻辑
JVM 方法调用依赖 descriptor(方法描述符),而非源码表面签名。没有桥接方法时:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 通过 Comparable 引用调用 compareTo,JVM 查找 compareTo(Object)
- 子类字节码中只有 compareTo(Integer),匹配失败 → 可能调用父类默认实现或抛 AbstractMethodError
有了桥接方法后:
- 子类字节码中同时存在 compareTo(Integer) 和 compareTo(Object)(桥接版)
- JVM 按 descriptor 找到桥接方法,再由它转发至真实方法
- 无论用接口类型还是实现类类型调用,最终都执行子类逻辑
覆盖返回值协变:统一支持更具体的返回类型
不只是泛型,任何返回类型更具体的重写都会触发桥接,例如:
- 父类:public Number getValue()
- 子类:@Override public Integer getValue()
- 桥接方法:public Number getValue() { return this.getValue(); }
这说明桥接是 JVM 对“返回类型协变”的字节码级支持机制——把语义合理的重写,翻译成 descriptor 层面等价的形式,使动态绑定能正常工作。
桥接方法的边界与注意事项
它不恢复泛型信息,也不提供额外类型安全:
- 反射获取桥接方法的 getReturnType() 返回的是擦除后的类型(如 Object.class),不是原始泛型类型
- 若子类参数类型与父类擦除后不兼容(如父类 set(T) 擦除为 set(Object),子类却声明 set(Integer)),编译直接报错,不会生成桥接
- 桥接方法内部只是强制转型+转发,运行时若传入非法类型,仍会抛 ClassCastException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










