Как работает принцип подстановки Лискова для таких классов, как Object?

Короче говоря, принцип подстановки Лисков гласит, что экземпляры базового (супер) класса должны быть полностью заменяемы экземплярами его производных (под) классов без введения какого-либо ломающего кода, такого как создание новых ошибок, изменение контракта методов и т. д.

Это означает, что java.lang.Object должен везде заменяться экземплярами любого из его подклассов. Однако каждый класс является подтипом 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!

Я неправильно понимаю LSP? Или структура языка Java в некоторых случаях нарушает LSP?


person Debanik Dawn    schedule 10.09.2020    source источник
comment
Вы не продемонстрировали замену какого-либо объекта. Замена объекта суперкласса объектом подкласса фактически означает изменение исходного кода. Чтобы продемонстрировать LSP, вы должны показать две версии вашего кода, до и после замены.   -  person Sweeper    schedule 10.09.2020
comment
Хорошо, если я правильно понимаю, LSP не о приведениях? Речь идет о фактической замене экземпляра суперкласса одним из экземпляров подклассов и при этом оставаться действительным, верно?   -  person Debanik Dawn    schedule 10.09.2020
comment
Правильный. Дело не в слепках.   -  person Sweeper    schedule 10.09.2020


Ответы (1)


Если вы хотите думать о LSP с точки зрения приведения типов, это будет связано с повышением приведения, а не с понижением.

Можете ли вы безопасно передать NetworkAdapter методу, который принимает Object, или подкласс нарушает контракт родителя? Нарушения контракта Object включают неправильное выполнение equals и hashCode.

person jaco0646    schedule 11.09.2020