重写的方法在返回类型上可以有所不同吗?

2022-08-31 06:57:12

重写的方法可以有不同的返回类型吗?


答案 1

Java 支持*被覆盖方法的协变返回类型。这意味着被重写的方法可能具有具体的返回类型。也就是说,只要新的返回类型可分配给要重写的方法的返回类型,就允许这样做。

例如:

class ShapeBuilder {
    ...
    public Shape build() {
    ....
}

class CircleBuilder extends ShapeBuilder{
    ...
    @Override
    public Circle build() {
    ....
}

这在 Java 语言规范的第 8.4.5 节中指定:

如果返回类型是引用类型,则相互重写的方法之间的返回类型可能会有所不同。返回类型可替换性的概念支持协变返回,即返回类型对子类型的特化。

当且仅当满足以下条件时,具有返回类型 R1 的方法声明 d1 可替换返回类型为 R2 的另一个方法 d2:

  • 如果 R1 为空,则 R2 为空。

  • 如果 R1 是基元类型,则 R2 与 R1 相同。

  • 如果 R1 是引用类型,则:

    • R1 是 R2 的子类型,或者 R1 可以通过未经检查的转换转换为 R2 的子类型 (§5.1.9),或者

    • R1 = |R2|

("|R2|“是指 JLS §4.6 中定义的 R2 的擦除。


* 在 Java 5 之前,Java 具有不变的返回类型,这意味着需要方法重写的返回类型才能与被重写的方法完全匹配。


答案 2

是的,它可能会有所不同,但有一些限制。

在 Java 5.0 之前,重写方法时,参数和返回类型必须完全匹配。Java 5.0引入了一种称为协变返回类型的新工具。可以重写具有相同签名的方法,但返回返回的对象的子类。

换句话说,子类中的方法可以返回一个对象,该对象的类型是该方法在超类中具有相同签名的方法返回的类型的子类。