However, in programming real-world applications we frequently need to specialize related classes jointly. This requires the covariant rule, and works well in Eiffel. It fails because we have used inheritance to implement code re-use rather than subtyping, but have called a feature of the ancestor class on an object of the descendant class as if the descendant object were a true subtype. It is the compiler's job to detect and reject this error, to avoid the possibility of a run-time type error. Here's another example where a real-world situation suggests a covariant solution.
Herbivores eat plants.
Cows are herbivores. Grass is a plant. Cows eat grass but not other plants. This does what we want. Also consider the container 'diet'.