简而言之,Liskov的替换原则规定,基类(超级)类的实例应该与其派生(子)类的实例完全可替换,而不引入任何“中断代码”,如抛出新错误、更改方法的契约等。
这意味着java.lang.Object应该是可替换的,它的任何子类的实例都应该随处可见。但是,每个类都是对象的子类型。
我可以实例化一个类,例如,NetworkAdapter,并将它作为一个对象传递。根据LSP,我应该能够将该Object实例转换为一个随机子类,比如Foo?然而,NetworkAdapter和Foo是完全不兼容的。
NetworkAdapter nA = new NetworkAdapter();
Object obj = (Object) nA; // completely okay and legal
Foo foo = (Foo) obj; // ??? this would throw ClassCastException!我是不是理解错了?还是Java语言的结构在某些情况下违反了LSP?
发布于 2020-09-11 16:58:48
如果您想从铸造的角度考虑LSP,那么它将涉及到上播而不是下播。
您能安全地将NetworkAdapter传递给接受Object或子类是否违反父类契约的方法吗?违反Object合同的行为包括不正确地实施equals和hashCode。
https://stackoverflow.com/questions/63823095
复制相似问题