子类重写父类方法时返回值类型必须满足兼容性要求:基本类型和void必须完全相同;引用类型支持协变返回,可返回更具体的子类型;泛型协变需谨慎,list不是list的子类;@override注解用于编译期校验重写合法性。

子类重写父类方法时,返回值类型不能随意更改,必须满足兼容性要求:基本类型和 void 必须完全相同;引用类型允许“协变返回”,即子类可返回父类返回类型的子类,但不能扩大范围。
基本类型和 void 必须严格一致
如果父类方法返回 int、boolean、double 等基本类型,或 void,那么子类重写时返回类型必须一字不差:
- 父类:
public int getValue()→ 子类只能写public int getValue() - 父类:
public void print()→ 子类只能写public void print() - 不允许改成
long、Integer或Object,哪怕存在自动装箱或向上转型也不行
引用类型支持协变返回(JDK 5+)
当父类方法返回引用类型时,子类可返回其**更具体的子类型**,这是为了增强类型安全和表达力:
- 父类:
public Animal getAnimal()→ 子类可写public Dog getAnimal()(Dog extends Animal)✅ - 父类:
public List<string> getData()</string>→ 子类可写public ArrayList<string> getData()</string>✅ - 但不能反向:父类返回
String,子类返回Object❌(范围扩大,编译失败)
泛型返回值的协变需谨慎
泛型本身不参与协变判断,但类型参数需匹配。例如:
- 父类:
public List<number> numbers()</number>→ 子类不能直接返回List<integer></integer>,因为List<integer></integer>不是List<number></number>的子类 - 正确做法是使用通配符声明或保持原类型,或改用返回
Integer等具体类型(若方法签名中返回的是具体类而非泛型容器)
用 @Override 注解及时发现错误
即使你写了看似合理的返回类型,编译器也可能因不满足协变规则而报错。加上 @Override 能在编译期立刻暴露问题:
- 拼错方法名、参数不一致、返回类型违规 → 编译失败,避免隐式重载
- 它不是可选装饰,而是强制校验返回值是否真正符合重写语义的安全锁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











