Мне кажется, что вы думаете с точки зрения ссылок, а не с точки зрения объектов, и именно поэтому вы инвертируете определение правила.
Цитирую версию принципа из Википедии:
если S является подтипом T, то объекты
типа T можно заменить объектами
типа S
(которые, кажется, говорят то же самое, что и определение, которое вы дали, я полагаю, это от вашего инструктора)
В вашем примере T - Object
, а S - Cat
. Когда у вас есть ссылка типа T
Object copyCat;
принцип подстановки говорит о том, что эта ссылка может указывать на объект типа T или любого типа S, который является подклассом типа T. Поэтому допустимо любое из следующего:
copyCat = new Object();
copyCat = new Cat();
(и поскольку мы используем Object
здесь, который по определению является суперклассом любого класса Java, ссылка copyCat
может вообще указывать на любой тип объекта.)
Я думаю, что важным моментом здесь является то, что тип ссылки определяет, какие методы могут быть вызваны, независимо от того, какие методы поддерживает реальный объект, на который указывает объект. Вот почему экземпляр любого подкласса может быть присвоен ссылке.