java方法重载:异常行为

时间:2014-09-30 05:51:14

标签: java overloading

我尝试了两种情况如下:

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的引用不明确。

了解第二个为什么会出现编译错误。我的问题是使用相同的类比,第一种情况也应该返回错误但事实并非如此。为什么?

3 个答案:

答案 0 :(得分:4)

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

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

解决歧义的一种方法是改变参数的类型:

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

答案 1 :(得分:1)

因为你的参数与两种方法相匹配 你应该告诉什么是int什么是double 2是有效的double和int

试试

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

答案 2 :(得分:0)

在java中,如果将Integer值作为参数传递,则可以简单地传递它,编译器将该整数值编译为32位int值。如果要将Long值作为参数传递,则必须添加" L"在价值的最后像200L。然后编译器将其编译为64位长的值。

通常浮点值正在编译为double值。如果要将double值作为参数传递,则可以将其简单地传递为200.然后编译器编译为64位double值。如果要将浮点值作为参数传递,则必须添加" F"在价值结束时像200F。然后编译器将其编译为浮点值(32位)

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

如果将double值传递为2.0,则可以执行要执行的方法