方法有歧义

Dhr*_*val 4 java overloading compiler-errors

我正在尝试理解方法重载,但无法理解以下示例中出现以下代码错误的原因

public class OverLoading_OverRiding {
     public static void main(String[] args) {
        OverLoading_OverRiding o = new OverLoading_OverRiding();
        o.sum(5, 5);
    }

    void sum(int i, long j) {   }
    void sum(long i, int j) {   }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

方法 sum(int, long) 对于 OverLoading_OverRiding 类型是不明确的。

当我在同一个示例上执行显式转换时,它可以工作:

    o.sum(5, (long)5);
Run Code Online (Sandbox Code Playgroud)

Tob*_*sR. 5

问题是你的编译器不知道如果你调用 o.sum(5, 5);

  1. 他可以使用void sum(int i, long j) { }他将第一个 5 作为 int 和第二个 5 作为 long 的地方

  2. 他可以使用void sum(long i, int j) { } 他把前 5 个和第二个 5 一样长的地方

由于这两种方法都可以在本示例中使用,并且您的编译器始终只需要一个有效选项,因此您会收到错误消息,表明您的方法不明确。

如果你调用o.sum(5, (long)5);它只匹配方法void sum(int i, long j) { }


问题是,为什么要以这种方式重载方法?重载主要用于像这样的可选参数:

void myMethod(int i) {}
void myMethod(int i, bool b) {}
void myMethod(int i, string s) {}
Run Code Online (Sandbox Code Playgroud)

所以你可以像这样调用这个方法:

myMethod(42);
myMethod(42, true);
myMethod(42, "myString");
Run Code Online (Sandbox Code Playgroud)

也许这让您对方法重载有了一个想法。