In the Type variance section, we worked through examples of covariance and contravariance, and how each of these restricts type parameters to be used as input types or return types, respectively. This is usually not an issue when we are defining our own interfaces and classes, as we can come up with the correct abstractions required.
However, what about the case where someone else has defined a class to be invariant and you require it to be used in a covariant or contravariant way? Kotlin addresses this by introducing a powerful addition, called type projections.
When using type parameters, there is a distinction between use site and declaration site variance. Use site variance is the term used when the variance of type parameters is set by the variable itself, as in Java. Declaration site variance is the term used when the type or function determines the variance...