桥接方法是编译器自动生成的合成方法,用于解决泛型擦除后因签名不一致导致的重写失效问题:擦除后父类方法为Object getValue(),子类实现为String getValue(),编译器插入public Object getValue(){return (String)super.getValue();}并标记ACC_BRIDGE|ACC_SYNTHETIC。

Java 中桥接方法(Bridge Method)不是手动写的,而是编译器自动插入的“隐形适配层”,用来解决类型擦除后多态失效的问题。它的核心作用是:让接口或父类引用调用时,能正确路由到子类中泛型特化后的真实方法。
桥接方法怎么补上被擦除的重写关系
泛型在编译后全部擦除,比如 Holder<string></string> 的 T getValue() 擦成 Object getValue();而实现类写的是 public String getValue()。JVM 看签名不一致,本不该算重写——但 Java 要求多态必须成立,于是编译器悄悄加一个桥接方法:
- 方法名、参数类型、返回类型都和擦除后的父类方法完全一致(如
public Object getValue()) - 方法体只做一件事:强制类型转换 + 委托调用你写的特化方法(如
return this.getValue();) - 字节码中标记为
ACC_BRIDGE | ACC_SYNTHETIC,源码里看不到,但javap -v能查到
什么时候会生成桥接方法
不是所有泛型继承都会触发桥接,关键看“擦除前后签名是否断裂”:
- 父类/接口方法含泛型参数或返回值(如
<T> T get()或T getValue()) - 子类/实现类把该方法具体化(如写成
String getValue()或void set(String s)) - 擦除后,父类签名变成
Object getValue()/void set(Object o),而子类签名是String getValue()/void set(String s)→ 参数或返回类型不匹配 → 编译器补桥接 - 如果子类也写
Object getValue(),就不需要桥接
桥接方法如何支撑运行时多态调用
多态调用走的是 JVM 的虚方法分派机制,它只认签名,不认泛型。桥接方法正是为此服务:
立即学习“Java免费学习笔记(深入)”;
- 当你写
Holder<String> h = new StringHolder(); h.getValue();,JVM 查的是Holder接口擦除后的Object getValue() - 运行时对象是
StringHolder实例,JVM 在其类中找到桥接方法Object getValue() - 桥接方法内部执行
return (String) super.getValue();或直接调用你写的String getValue() - 整个过程对开发者透明,但没有它,
h.getValue()就无法指向子类逻辑
验证和调试桥接方法的存在
桥接方法不可见于源码,但可通过工具确认:
- 用
javap -c -v YourClass查看字节码,搜索bridge或synthetic关键字 - 观察方法 descriptor:比如同时存在
getValue()Ljava/lang/String;和getValue()Ljava/lang/Object; - 在调试器中,有时能看到同名方法但参数类型为
Object,那就是桥接方法 - 注意:桥接方法不能被 Java 源码直接调用,也不参与重载解析,只服务于
invokeinterface和invokespecial分派


















