SCJP问题:使用var-args重载Java方法.理由是什么?

Mar*_*kis 7 java overloading scjp variadic-functions

为什么以下程序会抛出异常?

public class MainClass{
  public static void main(String[] argv){
       callMethod(2);
  }
  public static void callMethod(Integer... i){
       System.out.println("Wrapper");
  }
  public static void callMethod(int... i){
       System.out.println("Primitive");
  }
Run Code Online (Sandbox Code Playgroud)

}

对于类型MainClass,方法callMethod(Integer [])是不明确的

好的,我可以看到两种方法中的任何一种都可以工作(如果另一种方法被注释掉),但我也知道如果一个原语与方法输入的类型不完全匹配,会发生什么情况.

尝试的第一件事是扩大原语.那么,如果有第三种方法:

      public static void callMethod(long i){
       System.out.println("long");
      }
Run Code Online (Sandbox Code Playgroud)

代码会打印很长时间

第二件事是封装原语.因此,如果有一个方法采用整数,那将是一个被调用的方法.

第三个优先事项是var-args.

基于上述优先顺序,我认为第二种情况就是如此.我希望将int包装成一个Integer并调用(Integer ...).但当然这不会发生.相反,抛出异常.

是否有人看到并可以解释为什么优先级不适用于此示例?

干杯!

Pop*_*ops 9

你是正确的,在拳击之前加宽,而在拳击之前.

但你似乎正在将第一种方法视为callMethod(Integer i),而不是callMethod(Integer... i).由于两种方法都使用var-args,因此存在优先级关系.也就是说,两者都不符合拳击的标准,但都符合var-args的标准.

请记住,加宽是非法的,然后是盒子(虽然我在发布这个答案之前做了一些研究,发现它是合法的盒子,然后加宽).同样,你不会得到盒子,然后是var-args行为; 编译器直接跳转到var-args步骤并看到两个采用var-args的方法.

编辑:我应该澄清,如果没有歧义,你会得到box-then-var-args行为.换句话说,如果只有一个callMethod(),那么Integer... i你会得到" Wrapper."