这是一段代码片段.
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)
它运行正常.有人可以帮我解决这个问题吗?谢谢.
编译器会准确地告诉您发生了什么.概念上Integer和int类型是相同的.因此,两种方法签名都是相同的.
假设它编译成功,编译器应该调用哪个方法?
类型Long和Integer不一样(换句话说,编译器将整数类型视为两种不同的类型),这就是它成功编译的原因:
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的算术运算.
请参阅积分类型作为参考.