Java泛型中为何能传入不同类型参数调用泛型方法?
Java泛型方法的类型推导逻辑
先看你提到的泛型方法:
public static <T> void inspect(T a, T b) { // ... }
调用inspect(new Integer(3), new String("What? How?"))能通过编译,核心原因是Java的泛型类型推导会自动确定T为两个参数类型的最小公共超类型。
在这里,Integer和String的共同超类型包含Object、Serializable等,编译器会推导出最具体的那个公共超类型——也就是Object。
你疑问的方法里的T tmp,此时T的静态类型就是Object。可以做个验证:在方法里添加代码打印tmp的类型,比如给tmp赋值a后,输出的是Integer的实际类型,但tmp本身的静态类型始终是Object。
本质上,Java泛型的类型推导规则允许这种情况:当多个参数对应同一个类型参数T时,编译器会寻找所有参数类型的上界交集,只要存在合法的公共超类型,就能完成推导。比如如果参数是Integer和Long,T会被推导为Number——这是二者最具体的公共超类型。
总结:
- 泛型方法的类型参数
T不需要等于某个参数的具体类型,只要是所有参数类型的公共超类型即可 - 编译器会自动选择最具体的公共超类型作为
T的实际类型 - 你例子中的
T最终就是Object,所以tmp的静态类型为Object,可以接收任意参数的值
内容的提问来源于stack exchange,提问作者YoavKlein
相关产品推荐
相关产品推荐

