2013-08-19 28 views
2

任何人都可以请解释为什么这段代码会引发一个模糊的过载错误,当然整数方法更具体和适用?Var-args overloading

感谢,

斯内德

package object_orientation; 
public class Ambiguous { 
    //ambiguous error compiler unsure whether boxing is needed or not 
    static void overload(Integer... d){ 
     System.out.println("Integer"); 
    } 

    static void overload(long... d){ 
     System.out.println("Long"); 
    } 

    public static void main(String a[]){ 
     int i = 1; 
     overload(i); 
    } 
} 
+1

看到“整数”与“int”不同。 Integer是一个包装。 – fpe

+1

好帖子在此 - http://stackoverflow.com/questions/2521293/b​​ug-with-varargs-and-overloading –

+1

如果你在你的重载方法中将'long ...'更改为'long',它将会被编译。我相信可变参数在编译时转换为数组,所以我认为这就是模糊发生的地方 –

回答

3

在Java中这些概念应该帮助, Boxing + Widening is allowed,但not Widening + Boxing

加宽的这些规则,拳击和可变参数应该有所帮助:

  1. 原始强化>拳击>可变参数。
  2. 加宽和拳击(WB)不允许。
  3. 允许拳击和加宽(BW)。
  4. 虽然超载,Widening +可变参数和Boxing +可变参数只能是 以互斥方式使用
  5. 不允许在包装类之间加宽。
  6. 加宽+ varArgs &单独允许装箱+可变参数(但在重载版本的方法中不允许)。
  7. 拳击+加宽比拳击+可变参数更受欢迎。

希望这会有所帮助。

+0

谢谢。我认为int会被简单地装箱并应用到Integer var-args并忽略长的var-args,因为你不能同时扩大和放置。编译器告诉我,我有一个模棱两可的错误类型暧昧 – Xivilai

+1

当然,NP。很高兴帮助。您可以通过接受答案来解决问题。谢谢 – JNL