I'm reading the first section of "Scala in depth", there are two sentences in the first section about "covariance" and "contrvariance":
Covariance (+T or ? extends T) is when a type can be coerced down the inheritance hierarchy.
Contravariance(-T or ? super T) is when a type can be coerced up the inheritance hierarchy.
I have read some documents about "Covariance" and "Contravariance", but I can't understand the word "coerced down" and "coerced up" here in this context.
Covariance: Accept T or lower.
I asked for a
[+Human]
, I will accept any of these:[Human, Programmer, Scala Dev]
.Contravariance: Accept T or higher.
I asked for a
[-Human]
, I will accept any of these:[Thing, Animal, Human]
.Inariance: Accept T and only T.
Coercion.
Coercing a type up/down the type hierarchy means checking that a type's super/sub type passes type constraints. For example, a covariant function needs a
Human
but we've only got aProgrammer
, that's ok, the compiler can coerce theProgrammer
intoHuman
to satisfy typing constraints.