繁体   English   中英

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

[英]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 )到方法参数类型( intlongdouble )的每次转换至少与其他候选方法中的相应转换。

intint的转换比从intdouble的转换更具体,因此,两种情况下的第二个重载都是“胜利的”。

对于第二个参数,在您的原始代码中,这是两个重载从intlong的转换,因此这意味着第二个重载总体上“获胜”。

在修改后的代码中,从intint的转换比从intlong的转换更具体,因此该参数的第一个重载“获胜”。 因此,对于一个参数,每个重载都比另一个重载好,并且调用是模棱两可的。

有关所有详细信息,请参见JLS第15.12.2节 (及其引用和包含的部分,尤其是15.12.2.5 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM