java - 方法不明确

标签 java compiler-errors overloading

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

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) {   }
}

我收到一个错误:

The method sum(int, long) is ambiguous for the type OverLoading_OverRiding.

当我对同一个示例执行显式转换时,它会起作用:

    o.sum(5, (long)5);

最佳答案

问题是如果你调用 o.sum(5, 5);

,你的编译器不知道使用哪个方法
  1. 他可以使用 void sum(int i, long j) { },其中他将前 5 个作为 int,将第二个 5 作为 long

  2. 他可以使用 void sum(long i, int j) { } 他将前 5 个作为 long,将第二个 5 作为 int

因为在这个例子中这两种方法都有效,而且你的编译器总是需要exactly one有效选项,所以你会收到错误消息,指出你的方法不明确。

如果你调用 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) {}

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

myMethod(42);
myMethod(42, true);
myMethod(42, "myString");

也许这会让您了解方法重载。

关于java - 方法不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29362998/

相关文章:

java - HttpClient.execute 总是给出异常

c++ - 编译器 g++ 无法创建 a.out 文件?

c# - 重载解析选择不兼容的泛型方法而不是兼容的基类方法

perl - 多重继承 - 选择了错误的重载

Java/Bukkit 插件 & Fat Jar : ClassNotFoundError

java - 如何使用 Ant 脚本运行 main() 方法?

java - 如何为使用 JSP 生成的下载文件显示 "save file"对话框?

java - 无法使用 setDefaultCloseOperation 关闭窗口

java - ';'表达式错误的预期和非法开始

python - types 模块中的重载装饰器似乎没有按预期运行