java泛型通过编译器生成的桥接方法实现多态——擦除后签名不一致时,桥接方法(bridge/synthetic)强制类型转换并委托调用,使接口引用能正确路由到具体实现,支撑协变返回与泛型多态。

Java 泛型本身不保留运行时类型信息,但多态依然能正常工作——关键靠编译器自动生成的桥接方法(Bridge Method)。它不是你写的代码,却默默补全了擦除后的方法重写关系,让接口或父类引用调用时,能准确路由到具体实现。
桥接方法怎么补全重写关系
泛型接口或类在编译时被擦除,比如 Info<integer></integer> 的 info(Integer) 擦除后变成 info(Object)。而实现类若只写 public Integer info(Integer var),JVM 看不到它与接口方法的重写关系——因为签名不一致。
编译器会自动添加一个桥接方法:
- 方法签名与擦除后一致:例如
public Object info(Object var) - 标记为
bridge和synthetic(反编译可见,源码不可见) - 方法体只做一件事:强制类型转换后委托给你的具体实现,如
return this.info((Integer) var);
多态调用实际走哪条路径
当你通过泛型接口引用调用方法时,JVM 并不关心泛型参数,只看运行时对象的真实类型和方法签名:
-
Info<string> ref = new StringInfo();</string>→ 实际是StringInfo实例 - 调用
ref.info("abc")时,JVM 查找StringInfo中匹配info(Object)的方法 - 找到桥接方法,执行其中的类型转换和转发,最终进入你写的
public String info(String)
整个过程对开发者透明,但正是桥接方法让“接口多态 + 具体返回类型”得以成立。
协变返回类型的底层支撑
接口实现类返回更具体的类型(如 String 替代 Object),表面像协变,实则依赖桥接方法:
- 接口定义
T get(),擦除后是Object get() - 实现类写
public String get(),编译后同时存在:
– 你写的String get()
– 编译器生成的桥接方法Object get() - 外部通过接口调用
get(),命中桥接方法;内部强转并返回字符串,类型安全由编译器插入的转换保证
default 方法是否需要桥接
接口中定义的 default 方法,若不含泛型参数,直接按普通实例方法处理,无需桥接;若含泛型参数(如 <t> T doSomething(T t)</t>),同样会被擦除,并可能生成桥接方法以适配实现类的特化重写。但未被重写的 default 方法,由接口自身提供实现,不涉及桥接逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











