Maison > développement back-end > C++ > Quelle est la différence entre covariance et contravariance dans la programmation orientée objet ?

Quelle est la différence entre covariance et contravariance dans la programmation orientée objet ?

Linda Hamilton
Libérer: 2025-01-20 17:12:10
original
855 Les gens l'ont consulté

What is the Difference Between Covariance and Contravariance in Object-Oriented Programming?

Compréhension approfondie de la covariance et de la contravariance

La covariance et la contravariance dans la programmation orientée objet permettent le remplacement de différents types dans différentes situations tout en maintenant la sécurité des types.

Covariance

La covariance s'applique lorsqu'un "supertype" (plus général) est utilisé en remplacement d'un "sous-type" (plus spécifique) dans la position de sortie (par exemple, comme valeur de retour). Dans ce cas, vous pouvez attribuer une liste de supertypes à une liste de sous-types :

<code class="language-java">List<Fruit> fruits = new ArrayList<>();
List<Apple> apples = fruits; // 协变:List<Apple> 是 List<Fruit> 的子类型</code>
Copier après la connexion

Contravariance

La contravariance s'applique lorsqu'un "sous-type" est utilisé en remplacement d'un "supertype" à la position d'entrée (par exemple, en tant que paramètre de méthode). Dans ce cas, vous pouvez passer une expression lambda qui accepte un sous-type à une expression lambda qui attend un supertype :

<code class="language-java">Comparator<Apple> compareApples = (a, b) -> a.compareTo(b);
Comparator<Fruit> compareFruits = compareApples; // 逆变:Comparator<Apple> 是 Comparator<Fruit> 的子类型</code>
Copier après la connexion

Mots clés « in » et « out »

Les mots-clés "in" et "out" dans les génériques sont utilisés pour spécifier la variance des paramètres génériques. "out" signifie covariance, "in" signifie contravariance.

Dans l'exemple de l'interface MyInterface :

  • Covariance (valeur de retour) :
<code class="language-java">interface MyInterface<out T> {
    T get(); // T 可以是 T 的原始类型的任何子类型
}</code>
Copier après la connexion
  • Inversion (paramètres d'entrée) :
<code class="language-java">interface MyInterface<in T> {
    void set(T value); // T 必须是 T 的原始类型的子类型
}</code>
Copier après la connexion

En résumé, la covariance et la contravariance permettent une substitution de type sûre en fonction de l'utilisation prévue du type générique, garantissant la sécurité du type tout en offrant une flexibilité de conception du code.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal