为什么编译器会给出不明的方法调用错误?

ben*_*enz 1 java

这是一段代码片段.

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);
     }
}
Run Code Online (Sandbox Code Playgroud)

该程序编译良好.当我运行程序时,它给了我

java:对调用的引用是不明确的,com.exams.BoxVar中的方法调用(java.lang.Integer ...)和com.exams.BoxVar中的方法调用(int ...)匹配

有人可以解释一下原因吗?

最重要的是,我尝试将第一种方法转换为这样的方法.

 static void call(Long... i){
               System.out.println("hi"+i);
           } 
Run Code Online (Sandbox Code Playgroud)

它运行正常.有人可以帮我解决这个问题吗?谢谢.

Lew*_*rin 5

编译器会准确地告诉您发生了什么.概念上Integerint类型是相同的.因此,两种方法签名都是相同的.

假设它编译成功,编译器应该调用哪个方法?

类型LongInteger不一样(换句话说,编译器将整数类型视为两种不同的类型),这就是它成功编译的原因:

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

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

请参阅积分类型作为参考.