Invariance, covariance et contravariance
En programmation orientée objet il existe la notion d’invariance, covariance et contravariance.
Que signifie ces termes exactement ?
Si A
et B
sont deux types, que A
est un sous-type de B
et f
une transformation de type alors :
f
est covariant sif(A)
est un sous-type def(B)
f
est contravariant sif(B)
est sous-type def(A)
f
est invariant si aucune des deux propositions précédentes est vraie
Il existe également la notion de bivariance, où les deux propositions sont vraies.
En Java si on considère les types génériques comme une transformation, on peut alors dire qu’ils sont invariants.
En effet String
est un sous-type de Object
mais List<String>
n’est pas un sous-type de List<Object>
(pas plus
que List<Object>
n’est un sous-type de List<String>
).
Les tableaux par contre sont covariants. En effet String[]
est un sous-type de Object[]
.
Il n’y a pas de fonctions contravariantes en Java, contrairement à Scala par exemple.