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