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)”。
答案 0 :(得分:7)
Boxing和Unboxing转换仅应用于方法重载决策的第二阶段,而第二阶段仅在第一阶段未找到任何匹配候选时执行。在您的示例中,在第一阶段中找到String m(Object o)
,因此从不执行第二阶段。
第一阶段没有使用装箱和拆箱的原因是在更高版本的Java中引入了自动装箱和自动拆箱转换,设计人员不想破坏工作代码。