java 5.0 起支持协变返回类型,允许子类重写方法时返回比父类更具体的子类型。只需在子类中声明返回值类型为父类返回类型的子类即可,无需修改方法签名。

getShape() 如何从 Object 变为 Circle
当父类方法返回基类对象时,子类可以将其重写为返回特定的子类对象。编译器会自动处理向上转型的兼容性,调用者可以直接使用子类特有的方法。

class Shape {
String type = "Shape";
Shape getShape() { return this; }
}
class Circle extends Shape {
@Override
Circle getShape() { return this; }
void draw() { System.out.println("Drawing Circle"); }
}
public class Main {
public static void main(String[] args) {
Shape s = new Circle();
// 编译通过,因为 Circle 是 Shape 的子类
Shape result = s.getShape();
// 如果知道具体类型,可以强转或直接调用
if (s instanceof Circle) {
((Circle)s).draw();
}
}
}
运行结果:
Drawing Circle
泛型场景下 Builder 的链式调用优化
在使用构建器模式时,父类通常返回 Builder,子类重写后返回 SpecificBuilder 可以避免每次调用后都需要强制类型转换,使链式调用更流畅。

abstract class Builder<t> {
abstract T build();
abstract Builder<t> setFlag(boolean flag);
}
class UserBuilder extends Builder<user> {
private boolean flag;
@Override
UserBuilder setFlag(boolean flag) {
this.flag = flag;
return this;
}
@Override
User build() {
return new User(flag);
}
}
public class Main {
public static void main(String[] args) {
// 不需要强转,直接链式调用
User user = new UserBuilder()
.setFlag(true)
.build();
}
}</user></t></t>
运行结果:无直接输出,但代码结构展示了链式调用的便利性。
重写方法时若返回类型不匹配会怎样
如果子类返回的类型不是父类返回类型的子类,编译器会报错。必须确保继承关系成立,否则无法构成有效的重写。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











