This question already has answers here:
Why does autoboxing make some calls ambiguous in Java?
                                
                                    (6个答案)
                                
                        
                                3年前关闭。
            
                    
public class P {
  String m(int i) {
    return "P.m(int)";
  }

  String m(Object o) {
    return "P.m(Object)";
  }
}

public class Test {
  public static void main(String[] args) {
    P p = new P();
    System.out.println(p.m(Integer.valueOf(42)));
  }
}


我不明白为什么该程序打印“ P.m(Object)”而不是“ P.m(int)”。

最佳答案

装箱和拆箱转换仅应用于方法重载解决方案的第二阶段,并且仅在第一阶段找不到任何匹配的候选者时才执行第二阶段。在您的示例中,在第一阶段找到了String m(Object o),因此从不执行第二阶段。

在第一阶段不使用装箱和拆箱的原因是,自动装箱和自动拆箱转换是在更高版本的Java中引入的,设计人员不想破坏正常工作的代码。

08-06 04:37