多态通过参数和返回值使用父类或接口类型提升复用性与可扩展性:参数声明为抽象类型可接收任意子类实例并自动调用重写方法;返回值声明为通用类型可隐藏具体实现;结合泛型可在保持灵活性的同时增强类型安全。

多态让方法能接收更宽泛的类型、返回更通用的接口,从而提升代码复用性与可扩展性。关键不在于“能不能用”,而在于“怎么用才自然又安全”。
方法参数中用父类/接口类型接收子类对象
把参数声明为抽象类或接口,实际传入任意具体子类实例,调用时自动执行对应子类的重写方法。
- 避免为每个子类单独写重载方法,比如不用分别写 processDog(Dog d)、processCat(Cat c)
- 典型场景:集合批量处理——void feed(Animal a) 可以喂 Dog、Cat、Bird,无需修改方法签名
- 注意:只能访问参数声明类型中定义的方法,不能直接调用子类特有成员(除非向下转型)
返回值类型声明为父类或接口,实际返回子类实例
方法对外暴露统一类型,内部灵活创建不同实现,调用方按需使用,不感知具体实现细节。
- 常见于工厂方法或策略选择:比如 Shape createShape(String type) 返回 Shape,但内部可能 new Circle() 或 Rectangle()
- 调用方只需依赖 Shape 接口调用 draw(),后续新增 Triangle 不影响原有代码
- 若需子类特有行为,应通过接口扩展(如增加 hasRadius())而非强制转型
结合泛型进一步增强类型安全
纯多态有时会丢失具体类型信息,搭配泛型可在保持灵活性的同时约束边界。
- 例如:public
void handle(T animal) ,既支持多态,又保留了 T 的具体类型用于泛型操作 - 返回值也可泛型化:public
T getVehicle(String type) ,调用时可明确推断返回类型 - 避免泛型擦除带来的运行时类型模糊,尤其在需要反射或序列化时更稳健
多态不是为了炫技,而是让变化的部分隔离、稳定的部分复用。参数和返回值是接口契约最直接的体现,用好它们,扩展新类型就只是加个类、改个工厂,而不是翻遍代码修接口。








