Dans de nombreux OOP Langues de programmation, les types peuvent être faits co -, Contra- ou In- variante. La plupart (sinon toutes ces langues) sont capables de laisser les variables à être mutées en place, c'est-à-dire qu'ils ne sont pas des langues totalement immuables.
J'ai vu dans ceci SO Réponse Cela, In Scala au moins, ni Un type de covariant peut apparaître dans une position contravérie ni un type de contravariat peut apparaître dans une position de covariant .
Le problème que j'ai avec cette réponse (et en fait avec tous les exemples similaires que j'ai jamais trouvés sur Internet) est qu'il s'appuie sur mutabilité Pour montrer la preuve du fait ci-dessus.
Donc, mes questions sont:
Supposons que vous ayez une fonction qui prend une liste/une matrice et une fonction de comparaison et renvoie une nouvelle avec les éléments triés. Si j'ai une liste d'objets entiers, j'ai besoin d'une fonction pouvant trier les entiers: compare(a,b)
. Avec la typage sans variance, je devais spécifier que la fonction doit prendre des entiers compare(a: Integer, a:Integer)
ou qu'il doit prendre un super type d'entier spécifique. compare(a: Object, a:Object)
. Mais que se passe-t-il si j'ai une comparaison définie comme compare(a: Number, b: Number)
? Cela devrait fonctionner bien mais je ne peux pas l'utiliser dans les deux cas. Nous devons donc être capables de spécifier que la fonction de comparaison doit être capable de manipuler entier ou tout Superclass de Integer I.e. Contra-variance.