Maison >Java >javaDidacticiel >Comment la covariance, l'invariance et la contravariance affectent-elles les relations de types dans la programmation ?

Comment la covariance, l'invariance et la contravariance affectent-elles les relations de types dans la programmation ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-12 03:28:01321parcourir

How do Covariance, Invariance, and Contravariance Affect Type Relationships in Programming?

Covariance, invariance et contravariance en anglais simple : une explication complète

La covariance, l'invariance et la contravariance sont des concepts de programmation qui décrivent comment le la relation entre les types et les sous-types est affectée par les transformations de type. Ces concepts jouent un rôle crucial dans la compréhension du polymorphisme et de la sécurité des types dans les langages de programmation.

Covariance

Une covariance indique que la relation de sous-type est préservée par la transformation de type. En d’autres termes, si le type A est un sous-type du type B, alors le type transformé f(A) est également un sous-type de f(B). Par exemple, considérons la transformation f(A) = List, où List est déclarée comme :

class List<T> { ... }

Depuis List est un sous-type de List, nous avons f(String) = List est un sous-type de f(Object) = List. Par conséquent, f est covariant.

Contravariance

La contravariance est l'opposé de la covariance. Cela indique que la relation de sous-type est inversée par la transformation de type. Si A est un sous-type de B, alors f(B) est un sous-type de f(A). Par exemple, considérons la transformation f(A) = A[]. La transformation inverse la relation de sous-type entre les tableaux : Object[] est un sous-type de String[], mais String[] n'est pas un sous-type de Object[]. Cela rend f contravariant.

Invariance

L'invariance se produit lorsque ni la covariance ni la contravariance ne sont valables. En d’autres termes, la relation de sous-type n’est ni préservée ni inversée par la transformation de type. Par exemple, considérons la transformation f(A) = Map. Si A est un sous-type de B, rien ne garantit que f(A) = Map est un sous-type de f(B) = Map. Ainsi, f est invariant.

Applications dans les fonctionnalités du langage

  • Affectation : Les types d'objets en Java sont invariants. Par conséquent, l'instruction d'affectation ArrayList strings = new ArrayList(); n'est pas valide mais Object[] objects = new String[1]; est valide.
  • Invocation de méthode : L'invocation de méthode s'appuie sur la relation de sous-type pour la vérification du type. La méthode method(ArrayList list) peut être invoquée avec l'argument new ArrayList() mais pas new ArrayList().
  • Method Overriding : lors du remplacement méthodes, les types de paramètres doivent être covariants ou invariants, tandis que les types de retour doivent être covariants ou invariant. Par exemple, le code suivant est valide car le type de retour est covariant :
  • class List<T> { ... }

    Comprendre la covariance, l'invariance et la contravariance est essentiel pour comprendre le comportement des opérations polymorphes et garantir la sécurité des types dans la programmation.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn