7

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

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");
  }

}

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

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

尝试的第一件事是扩大原语。所以,如果有第三种方法:

      public static void callMethod(long i){
       System.out.println("long");
      }

代码会打印很长

第二件事是对原语进行装箱。因此,如果有一种方法采用整数,那将是调用的方法。

第三个优先级是 var-args。

基于上述优先级,我希望第二个优先级是这种情况。我希望将 int 包装成一个 Integer 并调用 (Integer...) 。但是,这当然不会发生。相反,会引发异常。

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

干杯!

4

1 回答 1

9

你是对的,扩大在拳击之前,而拳击又在 var-args 之前。

但是您似乎将第一种方法视为callMethod(Integer i),而不是callMethod(Integer... i)。由于这两种方法都使用 var-args,所以有一个优先级tie。也就是说,没有一个符合单独装箱的标准,但都符合 var-args 的标准。

Remember that it's illegal to widen, then box (although I did some research before posting this answer and found that it IS legal to box, then widen). Similarly, you won't get box, then var-args behavior; the compiler skips right to the var-args step and sees two methods that take var-args.

EDIT: I should clarify that you WILL get box-then-var-args behavior if there's no ambiguity. In other words, if there was only one callMethod(), and it took Integer... i, you would get "Wrapper."

于 2010-02-23T21:48:24.377 回答