我尝试了两种情况如下:
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的引用不明确。
了解第二个为什么会出现编译错误。我的问题是使用相同的类比,第一种情况也应该返回错误但事实并非如此。为什么?
答案 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,则可以执行要执行的方法