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");
  }
}
对于类型MainClass,方法callMethod(Integer [])是不明确的
好的,我可以看到两种方法中的任何一种都可以工作(如果另一种方法被注释掉),但我也知道如果一个原语与方法输入的类型不完全匹配,会发生什么情况.
尝试的第一件事是扩大原语.那么,如果有第三种方法:
      public static void callMethod(long i){
       System.out.println("long");
      }
代码会打印很长时间
第二件事是封装原语.因此,如果有一个方法采用整数,那将是一个被调用的方法.
第三个优先事项是var-args.
基于上述优先顺序,我认为第二种情况就是如此.我希望将int包装成一个Integer并调用(Integer ...).但当然这不会发生.相反,抛出异常.
是否有人看到并可以解释为什么优先级不适用于此示例?
干杯!
你是正确的,在拳击之前加宽,而在拳击之前.
但你似乎正在将第一种方法视为callMethod(Integer i),而不是callMethod(Integer... i).由于两种方法都使用var-args,因此存在优先级关系.也就是说,两者都不符合拳击的标准,但都符合var-args的标准.  
请记住,加宽是非法的,然后是盒子(虽然我在发布这个答案之前做了一些研究,发现它是合法的盒子,然后加宽).同样,你不会得到盒子,然后是var-args行为; 编译器直接跳转到var-args步骤并看到两个采用var-args的方法.
编辑:我应该澄清,如果没有歧义,你会得到box-then-var-args行为.换句话说,如果只有一个callMethod(),那么Integer... i你会得到" Wrapper."
| 归档时间: | 
 | 
| 查看次数: | 2353 次 | 
| 最近记录: |