Метод в подклассе не может нарушать контракт в суперклассе, поэтому предположим, что у вас есть
Class SuperClass{
ReturnType method(ParameterType p) {..}
}
, тогда любой SubClass
должен либо переопределить метод с помощью
ReturnType method(ParameterType p) {..}
или
ReturnTypeSubclass method(ParameterType p) {..}
Это гарантирует, что при использовании класса не будет проблем с типами. Контракт не нарушается с ковариантными типами возврата, потому что ReturnTypeSubClass
является ReturnType
.
Если вы реализуете метод в SubClass
, например, так:
AnyType method(ParameterTypeSubClass p) {..}
..вы не переопределите это. Вы перегружаете это. Теперь есть два метода в SubClass
. Один унаследован от SuperClass
.
Представьте, что если он переопределяет его и кто-то использует класс следующим образом:
Super s = new SubClass;
s.method(new ParameterType());
будет выдана ошибка, поскольку метод переопределения не будет может взять ParameterType
, и контракт будет расторгнут.