public class OverLoad {
void method(Integer i){
System.out.println("Integer "+i);
}
void method(int i){
System.out.println("in "+i);
}
public static void main(String a[]){
OverLoad m= new OverLoad();
m.method(2); //it calls method(int i) why?
}
}
如果我调用m.method(3)
,它会调用int方法为什么?
如果我调用m.method((Integer)3)
,那么它将调用Integer方法。
默认情况下,它会进入原始数据类型
答案 0 :(得分:8)
默认情况下,它会进入原始数据类型
是的,因为这是参数的确切类型。文字2
的类型是int
,而不是Integer
(JLS 3.10.1)。它可以通过拳击转换(JLS 5.1.7)转换为Integer
,但只有在实际需要时才会发生。
根据JLS 15.12.2:
,Java分为三个阶段第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段。
因此m.method(2)
在第一阶段匹配method(int)
,因此无需进入第二阶段。
答案 1 :(得分:6)
那是因为2 是一个原始整数 - 而不是Integer
类型的对象。
只有在找不到完美匹配签名(使用int)时才会发生自动装箱。
通过使用参数(Integer)3
调用,您可以强制编译器将int
3
自动装箱到Integer
对象中。