问题描述
简而言之,Liskov的“替换原理”指出,基类(超级类)的实例应该可以用其派生(子)类的实例完全替换,而不会引入任何“破坏性代码”,例如抛出新错误,更改方法的约定,等
这意味着java.lang.Object
应该可以被任何地方的任何子类的实例替换。但是,每个类都是Object的子类型。
我可以实例化一个类,例如NetworkAdapter
并将其作为对象传递,并且根据LSP,我应该能够将该Object
实例转换为一个随机子类,例如{{ 1}}?但是,Foo
和NetworkAdapter
彼此完全不兼容。
Foo
我理解LSP错误吗?还是Java语言的结构在某些情况下违反了LSP?
解决方法
如果您想在转换方面考虑LSP,那么它会关注的是上播而不是下播。
您能否安全地将NetworkAdapter
传递给接受Object
的方法,或者子类是否违反了父合同?违反Object
合同将包括错误地实施equals
和hashCode
。