被覆盖的方法可以有 不同的返回类型 吗?
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|
如果返回类型是引用类型,则返回类型可能会因相互覆盖的方法而异。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 中所定义。)