首页/开发/代码质量与评审速查/LSP 与协变逆变:类型层面的替换规则
设计原则与模式62 条

LSP 与协变逆变:类型层面的替换规则

参数类型可以放宽(逆变:子类接受更宽输入),返回类型可以收窄(协变:子类返回更具体类型);语言若不允许表达更宽参数,常用重载或 Object 参数配合运行时校验。

输入逆变(放宽)
输出协变(收窄)
原因满足契约的替换语义

语言示例

语言示例
// Java:返回类型协变,参数不变(需重载模拟逆变)
// C#:支持 in/out 变体声明
// TypeScript:方法参数双变,需额外注意安全性

易错点

  • 误以为所有语言都支持参数逆变:写出编译不过或行为不符的覆写
  • 依赖双变语言的宽松检查:运行时才暴露类型错误

数据来源与参考

  • Liskov & Wing(1994);语言类型系统文档(Java/C#/TypeScript)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌