2014-10-26 43 views
1

这是一段代码片段。为什么编译器给出了一个有害的方法调用错误?

class BoxVar{ 

     static void call(Integer... i){ 
      System.out.println("hi"+i); 
     } 
     static void call(int... i){ 
      System.out.println("hello"+i); 
     } 
     public static void main(String... args){ 
        call(10); 
    } 
} 

程序编译得很好。当我运行该程序,它给了我

的java:参考调用是模糊的,在com.exams.BoxVar两个方法 调用(java.lang.Integer中...)和方法调用(INT .. ) in com.exams.BoxVar match

有人可以解释我的原因吗?

最重要的是,我试着将第一种方法转换成这样的东西。

static void call(Long... i){ 
       System.out.println("hi"+i); 
      } 

它运行良好。有人可以帮我解决这个问题吗?谢谢。

+0

这是因为你输入的是整数,一个只是包装,而另一个是实际的类 – DreadHeadedDeveloper 2014-10-26 20:27:56

回答

5

编译器告诉你到底发生了什么。概念上Integerint类型是相同的。因此,两种方法签名都是相同的。

假设编译成功,编译器调用哪种方法?

类型LongInteger是不一样的(换句话说,编译器看到的整数类型为两个不同的类型),这就是为什么它成功编译:

INT:默认情况下,int数据类型一个32位带符号的二进制补码整数,其最小值为-231,最大值为231-1。在Java SE 8和更高版本中,可以使用int数据类型来表示无符号的32位整数,其最小值为0,最大值为232-1。使用Integer类将int数据类型用作无符号整数。有关更多信息,请参阅数字类部分。像compareUnsigned,divideUnsigned等静态方法已被添加到Integer类以支持无符号整数的算术运算。

long:长数据类型是一个64位二进制补码整数。有符号的长整数的最小值为-263,最大值为263-1。在Java SE 8和更高版本中,可以使用长数据类型来表示无符号的64位长,其最小值为0,最大值为264-1。当您需要的值范围比int提供的范围宽时,使用此数据类型。 Long类还包含诸如compareUnsigned,divideUnsigned等方法来支持无符号long的算术运算。

参见Integral Types作为参考。

+0

非常感谢Lews帮助我理解这个概念。 – benz 2014-10-26 20:35:40

+0

当然,蒙代奈 – 2014-10-26 20:38:48

2

你已经得到了答案,为什么你的程序不编译。我将补充它与Long一起使用的原因。

天真,如果你使用类似:

long longVal = 10; 

编译器接受它并不会自动转换从intlong

但是,这并不与类型Long,其中预计实际long值工作:当编译器试图解决歧义

Long longObj = 10; // Won't compile. 

同样的原则也适用。如果您有两个名称相同的方法,但一个方法接受int和一个Long,并且您尝试用数字10调用它,它会识别出该数字是整数,并且它不是一个长整型值,因此会不会被自动装箱成龙。

如果您使用值10L调用它,则会看到数字很长,与int不兼容,但可以转换为Long

因此,在这种情况下,尝试使用call(10)没有任何歧义。

相关问题