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.
[TOP / ABSTRACT] Thing ↓ Animal ↓ Human ↓ Programmer ↓ Scala Dev [BOTTOM / SPECIFIC]
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 a Programmer
, that's ok, the compiler can coerce the Programmer
into Human
to satisfy typing constraints.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With