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

时间:2015-12-30 22:37:25

标签: java

我知道可以使用返回子类的方法覆盖方法。

它是否也可以通过返回子类的方法重载?

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

以上代码是否有效?(如果放在一个类中)

怎么样?

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

4 个答案:

答案 0 :(得分:3)

从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的使用变得复杂。当你可以合理地避免它时,最好不要超载mrthods。

答案 1 :(得分:2)

是的,它甚至不需要是子类foo()foo(int)是两个完全不同且无关的函数,就编译器而言,每个函数都可以有任何你想要的返回类型

答案 2 :(得分:2)

这个例子:

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

只要两个方法获得不同的变量集,返回不同类型就没有问题(即使它们不是子类)。

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

至于:

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

这个没有效,因为这里编译器不能“选择”使用哪一个。

答案 3 :(得分:1)

是的,你用foo(int a)过度foo,并给它一个新的数据类型String,编译器将其视为有效代码,但另一个Object foo()和String foo()在java中完全无效