Covariance is (roughly) the ability to mirror inheritance of \"simple\" types in complex types that use them.
E.g. We can always treat an instance of Cat<
Java employs the concept of use-site variance for generic types: the needed variance is specified at each use site. This is why Java programmers are required to be familiar with the so-called PECS rule. Yes, it is unwieldy and has already received plenty of criticism.