方法重载 - 引用是模糊的

Abd*_*ari 1 java overloading

我正试图更好地掌握函数重载.

我有这个测试程序(原谅我的C启发Java).

public class Test {
    static void f(int x, double y)
    {
        System.out.printf("%d, %f",x,y);
    }

    static void f(double x, int y)
    {
        System.out.printf("%f, %d", x, y);
    }


    public static void main(String args[]) {

    f(1, 2);

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我打电话,

f(1, 2);
Run Code Online (Sandbox Code Playgroud)

编译错误, *reference to f is ambiguous*

为什么这个错误?我们不打电话f(int, int)吗?但是没有声明这样的方法.我期待"找不到适合f的方法",但我没有得到一个,为什么?

Jon*_*eet 12

int可以转换为double所有这些语言,因此如果只有其中一种语言可用,则很容易:转换需要转换为a的值double,然后调用方法.

但是,在这种情况下,这两种方法都是"有效",每个将是对自己的罚款-但也不是比其他"更好",因为在每种情况下一个参数只需要身份intint转换,以及其他需要intdouble转换.因此,在Java和C#中,它都是模糊的,并且会因编译时错误而失败.我想象这就是在C++做太多,但我不知道.在Java和C#中,如果您还有一个方法static void f(int x, int y),那么对于该方法调用,这将明显优于其他两个方法中的任何一个.

如有疑问,请参阅相关语言规范.对于Java,JLS第15.12节是相关部分.在C#5规范中,它是7.5节.