为什么不在此 java 代码中应用拆箱?

Why isn't unboxing applied in this java code?

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后来的版本引入了自动装箱和自动拆箱转换,设计人员不想中断工作代码。