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>
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>
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
:
<code class="language-java">interface MyInterface<out T> { T get(); // T 可以是 T 的原始类型的任何子类型 }</code>
<code class="language-java">interface MyInterface<in T> { void set(T value); // T 必须是 T 的原始类型的子类型 }</code>
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!