[英]How does jvm resolve call to overloaded method in this case?
以下代码已成功编译
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 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.