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)));
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这个程序打印"Pm(Object)"而不是"Pm(int)".
Boxing和Unboxing转换仅应用于方法重载决策的第二阶段,而第二阶段仅在第一阶段未找到任何匹配候选时执行.在您的示例中,String m(Object o)在第一阶段中找到,因此从不执行第二阶段.
在第一阶段没有使用装箱和拆箱的原因是在更高版本的Java中引入了自动装箱和自动拆箱转换,并且设计者不想破坏工作代码.