我有方法调用,传递参数为(4,5)。
我有两种带有参数的方法:
method1(int a, int b);
method1(Integer a, Integer b);
将调用哪个方法,为什么?
答案 0 :(得分:5)
这已在The Java® Language Specification, §15.12.2. Compile-Time Step 2: Determine Method Signature中指定:
...
该过程的其余部分分为三个阶段,以确保与Java SE 5.0之前的Java编程语言版本兼容。这些阶段是:
- 第一阶段(§15.12.2.2)执行重载解析,不允许装箱或拆箱转换,也不允许使用可变arity方法调用。如果在此阶段未找到适用的方法,则处理将继续进行到第二阶段。
…- 第二阶段(§15.12.2.3)在允许装箱和拆箱的同时执行重载解析,但仍排除使用可变arity方法调用。如果在此阶段未找到适用的方法,则处理将继续进行到第三阶段。
…- 第三阶段(§15.12.2.4)允许将重载与可变arity方法,装箱和拆箱相结合。
因此,由于在第一阶段发现了method1(int a, int b)
,因此将使用它。如果在第一阶段没有找到匹配的方法,则只能在第二阶段找到method1(Integer a, Integer b)
。
答案 1 :(得分:1)
4
和5
是int
文字。因此,它们无需任何转换即可匹配您的method1(int a, int b)
。因此将选择method1(int a, int b)
。
为了选择method1(Integer a, Integer b)
,编译器必须将两个int
文字框装到Integer
中。只有在找不到与您的方法名称和传递的参数相匹配的方法(不需要装箱/拆箱转换)的情况下,才会发生这种情况。显然,这里不是这样,因为method1(int a, int b)
存在。即使method1(long a, int b)
或method1(long a, long b)
或method1(int a, long b)
也比method1(Integer a, Integer b)
更为可取,因为它们不需要装箱转换。
答案 2 :(得分:1)
@Eran和@Holger的答案都是正确的,并且解释得很好,但是如果您想自己尝试编写代码,则为:
public class Answer {
static void method1(int a, int b) {
System.out.println("Inside the method1(int, int)");
}
static void method1(Integer a, Integer b) {
System.out.println("Inside the method1(Integer, Integer)");
}
//Test
public static void main(String[] args) {
method1(4, 5);
method1(Integer.valueOf(4), Integer.valueOf(5));
// method1(4, Integer.valueOf(5)); //Ambiguous method call - won't compile
}
}
输出为:
Inside the method1(int, int)
Inside the method1(Integer, Integer)