以下代码已成功编译
class Overloading{
public static void aMethod (double val1, long val2) {
System.out.println ("double, long");
}
public static void aMethod (int val1, long val2) {
System.out.println ("int, long");
}
public static void main(String[] args) {
aMethod(9, 10);
}
}
但是当方法签名改变时
来自此
aMethod (double val1, long val2)
到此
aMethod (double val1, int val2)
发生了编译时错误
Overloading.java:12: error: reference to aMethod is ambiguous, both method aMeth
od(double,int) in Overloading and method aMethod(int,long) in Overloading match
aMethod(9, 10);
^
答案 0 :(得分:4)
首先,JVM不会解决重载问题 - 编译器会这样做。 (例如,JVM决定执行哪个重写方法。)
至于为什么方法调用变得模糊 - 编译器正在寻找一种方法,其中每个从方法参数类型(int
两个参数)的转换到方法参数类型(int
,long
或double
)至少与其他候选方法中的相应转换一样具体。
从int
到int
的转换比从int
到double
的转换更具体,因此您的第二次重载"胜出"在这两种情况下。
对于第二个参数,在原始代码中,对于两个重载,它都是从int
到long
的转换,这意味着第二个重载"胜出"整体。
在修改过的代码中,从int
到int
的转换比从int
到long
的转换更具体,所以首先超载"胜利"对于此参数。因此,对于一个参数,每个重载都比另一个更好,并且调用是不明确的。
请参阅JLS section 15.12.2(以及它所引用和包含的部分,尤其是15.12.2.5)以获取所有血腥细节。