Covariance, contravariance and invariance describe how the existing type inheritance hierarchy changes when subjected to some transformation (such as usage within generics).
If the transformation keeps the ordering of the original hierarchy, it is "covariant".
If it reverses it, it is "contravariant".
If it breaks it, it is "invariant".
- Stackoverflow.com Wiki