为何向同一泛型参数传入不同类型Java编译器不报错?
Java泛型方法调用的类型推断解析
先看你给出的代码:
public static <T> T foo(T x, T y) { return x ; } public static void main(String[] args) { Integer a = 0; String b = "bar"; System.out.println(foo(a, b)); }
1. 编译器为何未抛出错误?
Java编译器会通过类型推断找到两个实参类型的共同超类型,作为泛型参数T的类型。Integer和String的共同超类型包括Object、Serializable、Comparable<?>,编译器会将这些类型的交集作为T的实际类型(类型擦除后最终表现为Object)。此时方法的参数x和y都可以向上转型为这个共同超类型,返回值也符合T的约束,完全满足类型检查规则,所以不会报错。
2. 编译器何时确定传入的类型?
在编译阶段处理foo(a, b)这个方法调用时,编译器就会根据实参a(Integer类型)和b(String类型)的具体类型,计算出T的最小上界类型,完成类型推断。
3. 这种情况为何对编译器而言不存在歧义?
Java的类型推断规则会明确选取两个实参类型的**最小上界(Least Upper Bound)**作为T的类型。对于Integer和String来说,它们的共同超类型是确定的,编译器能唯一确定这个最小上界类型,不存在多个可选类型的冲突,所以完全没有歧义。
内容的提问来源于stack exchange,提问作者anupamD
相关产品推荐
相关产品推荐

