为什么在Java中重载方法时返回类型不能更改

为什么在Java中重载方法时返回类型不能更改,java,Java,我知道,要在Java中重载一个方法,我们需要更改参数中的某些内容,参数的数量或至少一个参数的类型。通过这种方式,编译器可以在编译时静态绑定将被调用的方法,但我只是想知道为什么不足以更改方法的返回类型,第一个响应是因为不明确,但在我看来,如果我们有: public class Test { public Integer method1(Integer a, Integer b) { return a + b; } public String method1

我知道,要在Java中重载一个方法,我们需要更改参数中的某些内容,参数的数量或至少一个参数的类型。通过这种方式,编译器可以在编译时静态绑定将被调用的方法,但我只是想知道为什么不足以更改方法的返回类型,第一个响应是因为不明确,但在我看来,如果我们有:

public class Test {
    public Integer method1(Integer a, Integer b) {
        return a + b;
    }

    public String method1(Integer a, Integer b) {
        return "test";
    }

    public static void main(String[] args) {
        String result = method1(2, 4);
    }
}
我知道这段代码不会编译,但我的问题是:编译器是否可能检查我们期望的返回类型,并在此基础上将调用绑定到正确的方法


编辑:我想在我的问题中说得非常清楚,我知道只有参数是方法签名的一部分,我知道我们可以让方法不返回任何内容,因此,我们存在歧义,因此应该引发编译错误,但是如果我们根本没有歧义呢??就像我提出的例子。。。这可行吗?有人知道不这样做的特殊原因吗?

方法重载基于更改方法的签名。由于方法的签名,您必须仅在参数上区分这两种方法

:包含方法签名和构造函数声明的唯一内容是其名称和参数类型。

如果两个方法具有相同的名称和名称,则它们具有相同的签名 参数类型

两个方法或构造函数声明M和N具有相同的参数 如果满足以下所有条件,则输入:

  • 它们具有相同数量的形式参数(可能为零)

  • 它们具有相同数量的类型参数(可能为零)

  • 设A1,…,An为M的类型参数,设B1,…,Bn为N的类型参数。 将N的类型中出现的每个Bi重命名为 Ai,相应类型变量的边界为 相同,且M和N的形式参数类型相同

方法m1的签名是方法m1的签名的子签名 方法m2,如果:

  • m2与m1具有相同的签名,或

  • m1的签名与m2签名的删除(§4.6)相同

有两个方法签名m1和m2 覆盖等价iff m1是的子签名之一 m2或m2是m1的子符号

在一个类中声明两个具有重写等效签名的方法是编译时错误。

这就是为什么你的陈述无法编译的原因;您将一个
整数
和一个
整数
传递给两个相同的*方法,Java无法消除它们之间的歧义

这意味着这样的声明是完全合法的:

…因为这两种方法的参数类型不同


*:“完全相同”就编译器而言。

您可以通过询问自己在以下场景中调用哪个方法来回答这个问题:

public static void main(String[] args) {
    Object result = method1(2, 4);
}

它将如何编译对象o=method1(2,4)。或者干脆
method1(2,4)?如果我想调用方法,比如
method1(1,2)不存储返回值?JVM应该调用什么?@Tom规则总是可以发明的,例如,可能缺少返回目标会导致歧义错误。这就是为什么像这样的问答完全是推测性的。@Radiodef如果需要将返回值存储在temp变量中以避免编译器错误,那么这样的规则可能会非常烦人。但是,我会考虑这种超载的代码气味,所以我不会接触这个规则:D有很多关于这个问题的答案。只需搜索“方法重载java返回类型”,OP已经知道了这一点。他问为什么返回类型不足以重载方法(或者为什么返回类型不是签名的一部分)。我添加了一个来自JLS的引用,以强调返回类型在方法签名中没有明确考虑。我可以理解这个答案。用事实来回答,因为这是我们能给出的答案。@Tom:唯一能明确回答为什么这不是签名的一部分的人是语言设计师自己。它也可能是C语言的一种保留,其中函数的签名是它的名称和参数类型。对。所以,我想我要做的是明确引用来自语言规范。这应该满足它的“为什么”部分;语言明确禁止它@汤姆,我不太清楚为什么我解释得不够简明扼要的原因是什么。事实仍然是-语言禁止了它。显然,返回
对象的对象被调用,或者产生了歧义错误。这到底是如何验证或否定OP的建议的?OP没有提出任何建议,而是提出了一个问题,在我看来,这个问题由我所写的回答了。我不想让他的问题无效,而是给他一些指示,告诉他如何自己得到答案。mued,但你所建议的情况是,要么我们有歧义,因此我们得到一个编译错误,要么我们可以添加一个新方法,专门返回一个对象。但在我们完全没有歧义的情况下,就像我提出的那样,我们并不清楚为什么这是不可行的。”在我看来,我的回答是“但你没有解释怎么做。”。而且,正如我所指出的,在你的回答中,可以发明规则来处理这个案例,就像OP建议发明规则来允许这样做一样。Java语言有处理重载歧义的规则,那么为什么您认为歧义与答案相关呢?对所有人的麻烦进行了更详细的描述
public static void main(String[] args) {
    Object result = method1(2, 4);
}