Почему допускается только контрастность входных параметров метода в соответствии с принципом подстановки Лискова?
Я пытался найти хорошие примеры того, почему контрастная дисперсия является единственной допустимой дисперсией для входных параметров метода в соответствии с принципом подстановки Лискова, но до сих пор ни один из примеров не дал полного ответа, сомневаюсь.
Я пытался создать контрпример, который мог бы доказать приведенное выше утверждение, но я не уверен в этом. Предположим, у нас есть следующие классы:
class Z {...}
class X extends Z {...}
class Y extends X {...}
class A {
void m(X x);
...
}
class B extends A {
void m(Y y); // Overriding inherited method m using covariance (by contradiction)
...
}
Теперь предположим, что у меня следующая ситуация:
B b = new B();
A a = b; // Allowed because b is also an A object (B extends A)
Теперь, так как статический тип a
является A
теоретически мы должны быть в состоянии пройти X
объекты к методу m
на a
(не уверен, что LSP говорит об этом):
a.m(new X());
С другой стороны, во время выполнения (не уверен, что LSP говорит о времени выполнения и времени компиляции), это может произойти, потому что a
на самом деле указывает на B
объект, но метод переопределен в B
m
только принимает Y
объекты подтипа X
,
Если бы мы позволили вместо этого противоречие, например, путем переопределения m
в B
указав тип параметра как Z
или же X
ничего этого не произойдет.
Это пока единственное объяснение моего (и моего друга) того, почему нам разрешено использовать только противоречие для параметров метода.
Правильно ли мое объяснение? Существуют ли другие ситуации, которые могут объяснить эту концепцию более подробно? Конкретные примеры приветствуются!