子类重写父类方法时返回值类型必须满足兼容性要求:基本类型须完全相同;引用类型支持协变返回(可为父类返回类型的子类),但不可为无关类型或父类;void、static、final、private 方法有特殊限制。

子类重写父类方法时,返回值类型必须满足兼容性要求:基本类型必须完全相同;引用类型可以是父类返回类型的子类(即支持协变返回),但不能是无关类型或父类。
基本类型必须严格一致
如果父类方法返回 int、double、boolean 等基本数据类型,子类重写时返回类型必须一模一样。例如父类返回 int,子类不能改成 long 或 Integer(后者虽是包装类,但属于引用类型,不适用此条)。
引用类型允许协变返回
当父类方法返回一个类类型(如 Animal、List<string></string>、A<t></t>),子类可将其重写为更具体的子类型:
-
Animal getPet()→ 可重写为Dog getPet()(Dog是Animal的子类) -
A<integer> create()</integer>→ 可重写为B create()(前提是B extends A<integer></integer>) - 泛型类中也适用,但需注意类型参数一致性,不能仅靠擦除后“看起来像”就认为合法
void 和 static 方法的特殊限制
void 方法重写时,返回值只能是 void,不可改为任何类型。
被 static 修饰的方法不属于重写范畴(属于隐藏),因此不参与返回值类型协变规则;final 或 private 方法也不能被重写。
为什么这样设计?
核心是保障里氏替换原则(LSP):用子类对象替换父类对象时,调用方代码不应出错。协变返回让结果更具体、更安全;而放宽返回类型(比如父类返回 Dog,子类返回 Animal)会破坏类型契约——调用方按 Dog 使用,实际拿到 Animal 就可能缺失特有方法,导致编译通过但运行异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











