[英]Why compiler gives ambigious method call error?
这是一个代码片段。
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 ...)和com.exams.BoxVar中的方法调用(int ...)都匹配
有人可以解释一下原因吗?
最重要的是,我尝试将第一种方法转换为这种方法。
static void call(Long... i){
System.out.println("hi"+i);
}
运行良好。 有人可以帮我解决这个问题吗? 谢谢。
编译器会告诉您确切的情况。 从概念上讲, 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和更高版本中,可以使用long数据类型表示无符号的64位long,其最小值为0,最大值为244-1。 当需要的值范围比int提供的值宽时,请使用此数据类型。 Long类还包含compareUnsigned,divideUnsigned等方法,以支持无符号long的算术运算。
请参阅整数类型作为参考。
您已经知道为什么程序无法编译。 我将添加它与Long
工作的原因。
天真的,如果您使用类似:
long longVal = 10;
编译器接受它并自动将int
转换为long
。
但这不适用于Long
类型,该类型需要实际的long
值:
Long longObj = 10; // Won't compile.
当编译器尝试解决歧义时,相同的原理也适用。 如果您有两个具有相同名称的方法,但是一个方法接受一个int
,一个则接受Long
,并且尝试使用数字10进行调用,则它将识别出该数字是整数,并且它不是long值,因此将不会自动装箱成龙。
如果使用值10L
调用它,则会看到该数字很长,与int
不兼容,但可以在箱中转换为Long
。
因此,在这种情况下尝试使用call(10)
不会产生歧义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.