小编典典

被覆盖的方法可以在返回类型上有所不同吗?

all

被覆盖的方法可以有 不同的返回类型 吗?


阅读 42

收藏
2022-08-27

共1个答案

小编典典

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

例如:

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

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

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

如果返回类型是引用类型,则返回类型可能会因相互覆盖的方法而异。return-type-substitutability
的概念支持协变返回,即将返回类型特化为子类型。

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

  • 如果 R1 无效,则 R2 无效。

  • 如果 R1 是原始类型,则 R2 与 R1 相同。

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

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

    • R1 = |R2|

(“|R2|”指的是 R2 的擦除,如JLS 的搂4.6
所定义。)


  • 在 Java 5 之前,Java 具有 不变 的返回类型,这意味着方法覆盖的返回类型需要与被覆盖的方法完全匹配。
2022-08-27