Java 一个方法可以被另一个返回子类的方法重载吗?

Java 一个方法可以被另一个返回子类的方法重载吗?,java,Java,我知道可以用返回子类的方法重写方法 它也可以被返回子类的方法重载吗 public Object foo() {...} public String foo(int a) {...} 上述代码有效吗?(如果放在类中) 那怎么办 public Object foo() {...} public String foo() {...} 是的,它甚至不需要是子类foo(),而foo(int)对于编译器来说是两个完全不同且不相关的函数,每个函数都可以有您想要的任何返回类型。此示例: public Obj

我知道可以用返回子类的方法重写方法

它也可以被返回子类的方法重载吗

public Object foo() {...}
public String foo(int a) {...}
上述代码有效吗?(如果放在类中)

那怎么办

public Object foo() {...}
public String foo() {...}

是的,它甚至不需要是子类
foo()
,而
foo(int)
对于编译器来说是两个完全不同且不相关的函数,每个函数都可以有您想要的任何返回类型。

此示例:

public Object foo() {...}
public String foo(int a) {...}
只要这两个方法得到不同的变量集,返回不同的类型就没有问题(即使它们不是子类)

逻辑非常简单-如果编译器可以毫无疑问地选择使用哪一个-没有问题。在这种情况下-如果你给方法int,它是一个方法,没有参数它是另一个,没有dilema(在这里相同的名称并不重要)

至于:

public Object foo() {...}
public String foo() {...}

这一个无效,因为在这里编译器无法“选择”使用哪一个。

是的,您用foo(int a)重载foo,并给它一个新的数据类型字符串,编译器将其视为有效代码,但另一个对象foo()和字符串foo()在java中完全无效,从java 5开始,被重写的方法允许使用协变返回类型。这意味着允许子类中的重写方法使用签名,该签名返回的类型可能是父签名返回类型的子类

要使其具体化,假设您有以下接口:

public interface MyInterface {
    Number apply(double op1, double op2);
      :
      :
}
以下是合法的,因为返回类型是Number的子类:

public class MyClass implements MyInterface {
    :
    :
    @Override
    public Integer apply(double op1, double op2) {
        :
        :
        return Integer.valueOf(result);
    }
}

因为重载方法(名称相同但签名不同)实际上是不同的方法,如果您愿意,您可以自由使用不同的返回类型。。。然而。。。这是不鼓励的,因为具有相同名称但不同返回类型的方法可能会让程序员感到困惑,并且会使API的使用变得复杂。如果可以合理避免的话,最好不要让mr方法过载。

为什么不试试看呢?不,Java不允许按返回类型进行多态性。您的示例之所以有效,是因为参数列表不同。您始终可以在覆盖中返回协变类型。但是,您不能提供一个重载,该重载等同于同一类中的另一个定义。“重载”,而不是“重载”。除此之外,还有更多的话要说。当Sub扩展Super时,publicssuperfoo(superx)可以与publicssubfoo(subx)共存。诚然,严格来说,这不是过载的情况,而是专门实现的情况。