繁体   English   中英

为什么编译器会给出模棱两可的方法调用错误?

[英]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);
           } 

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

编译器会告诉您确切的情况。 从概念上讲, 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和更高版本中,可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM