在调用参数为(int,int)的方法,签名为(int,int)或(Integer,Integer)的方法时将获得优先级

时间:2018-07-02 12:38:21

标签: java core

我有方法调用,传递参数为(4,5)。

我有两种带有参数的方法:

method1(int a, int b);
method1(Integer a, Integer b);

将调用哪个方法,为什么?

3 个答案:

答案 0 :(得分:5)

这已在The Java® Language Specification, §15.12.2. Compile-Time Step 2: Determine Method Signature中指定:

  

...

     

该过程的其余部分分为三个阶段,以确保与Java SE 5.0之前的Java编程语言版本兼容。这些阶段是:

     
      
  1. 第一阶段(§15.12.2.2)执行重载解析,不允许装箱或拆箱转换,也不允许使用可变arity方法调用。如果在此阶段未找到适用的方法,则处理将继续进行到第二阶段。
      …
  2.   
  3. 第二阶段(§15.12.2.3)在允许装箱和拆箱的同时执行重载解析,但仍排除使用可变arity方法调用。如果在此阶段未找到适用的方法,则处理将继续进行到第三阶段。
      …
  4.   
  5. 第三阶段(§15.12.2.4)允许将重载与可变arity方法,装箱和拆箱相结合。
  6.   

因此,由于在第一阶段发现了method1(int a, int b),因此将使用它。如果在第一阶段没有找到匹配的方法,则只能在第二阶段找到method1(Integer a, Integer b)

答案 1 :(得分:1)

45int文字。因此,它们无需任何转换即可匹配您的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)