在这种情况下,jvm如何解析对重载方法的调用?

时间:2014-06-28 11:32:20

标签: java oop overloading

以下代码已成功编译

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);
                ^

1 个答案:

答案 0 :(得分:4)

首先,JVM不会解决重载问题 - 编译器会这样做。 (例如,JVM决定执行哪个重写方法。)

至于为什么方法调用变得模糊 - 编译器正在寻找一种方法,其中每个从方法参数类型(int两个参数)的转换到方法参数类型(intlongdouble)至少与其他候选方法中的相应转换一样具体。

intint的转换比从intdouble的转换更具体,因此您的第二次重载"胜出"在这两种情况下。

对于第二个参数,在原始代码中,对于两个重载,它都是从intlong的转换,这意味着第二个重载"胜出"整体。

在修改过的代码中,从intint的转换比从intlong的转换更具体,所以首先超载"胜利"对于此参数。因此,对于一个参数,每个重载都比另一个更好,并且调用是不明确的。

请参阅JLS section 15.12.2(以及它所引用和包含的部分,尤其是15.12.2.5)以获取所有血腥细节。