以下代码已成功编译
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);
^
首先,JVM不能解决重载-编译器可以解决。(例如,JVM决定执行哪个重写方法。)
至于为什么在方法调用变得模糊-编译器正在寻找一个单一的方法,其中从该方法每次转换参数类型(int
对于两个参数)的方法参数类型(int
,long
或double
)至少与特定如在其它相应的转换候选方法。
从int
到int
的转换比从int
到的转换更具体double
,因此在两种情况下,您的第二个重载都会“获胜”。
对于第二个参数,在您的原始代码中,这是两个重载从int
到的转换long
,因此这意味着第二个重载总体上“获胜”。
在修改后的代码中,从int
到int
的转换比从int
到的转换更具体long
,因此该参数的第一个重载“获胜”。因此,对于一个参数,每个重载都比另一个重载好,并且调用是模棱两可的。
有关所有详细信息,请参见JLS第15.12.2节(及其引用和包含的部分,尤其是15.12.2.5)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句