我知道可以使用返回子类的方法覆盖方法。
它是否也可以通过返回子类的方法重载?
public Object foo() {...}
public String foo(int a) {...}
以上代码是否有效?(如果放在一个类中)
怎么样?
public Object foo() {...}
public String foo() {...}
答案 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中完全无效