2014-09-30 104 views
1

我试过两种情况如下:Java方法重载:异常行为

void ssss(int b){ 
    System.out.println ("int"+b); 
} 
void ssss(double b){ 
    System.out.println ("long"+b); 
} 

,并提出了方法调用作为

ssss(100); 

这工作得很好。

void calcAve(double marks1, int marks2) { 
    System.out.println ("first average"); 
} 
void calcAve(int marks1, double marks2) { 
    System.out.println ("second average"); 
} 

,并提出了方法调用作为

calcAve(2,3); 

这返回一个编译错误:参照calcAve是不明确的。

了解为什么第二个得到编译错误。我的问题是使用相同的比喻,第一个案例也应该返回一个错误,但事实并非如此。为什么??

+2

的方法,因为2可以是有效的int或双 – 2014-09-30 05:53:15

+0

因为你有2种重载方法,可以采取整数。 (double,int)以及(int,double)。像@getlost说的那样,'2'可以被看作是一个'int'和一个'double'。 – TheLostMind 2014-09-30 05:53:37

+0

在第二种情况下,你的数据类型不匹配 – 2014-09-30 05:54:19

回答

1

,因为你的参数匹配两种方法 你应该告诉什么是INT什么是双 2是有效的double以及INT

尝试

calcAve((int)2,(double)3); 
4

直观地说,在第一种情况是一种精确的类型匹配,而在第二种情况下,有两个不相同的匹配同样好(两个int都可以提升为double)。

准确的规则相当复杂,但您可以在JLS中找到它们:§15.12.2. Compile-Time Step 2: Determine Method Signature。解决歧义

一种方式是通过改变的参数的类型:

calcAve(2.0, 3); 
calcAve(2, 3.0); 
0

在Java中,如果你传递一个整型值作为参数,你可以简单地传递它,编译器在编译整数值为32位整型值。如果你想传递一个Long值作为一个参数,你必须在200L这个值的末尾添加“L”。然后编译器将其编译为64位长的值。

正常情况下,浮点值是作为双精度值编译的。如果你想传递一个double值作为参数,你可以简单地将它传递为200.然后编译器编译为64位double值。如果你想传递一个浮点值作为一个参数,那么你必须在200F这个值的末尾添加“F”。然后编译器将其编译为浮点值(32位)

在你的情况下,两个参数列表都与参数列表兼容。这就是为什么编译器无法识别确切的一个。

如果传递双值作为2.0,那么您可以执行要执行