Les génériques et l'utilisation de
En Java, les génériques permettent des opérations de type sécurisé sur une plus large gamme de types. Cependant, des questions se posent lors du choix entre
Map<String, Class<? extends Serializable>> expected = null; Map<String, Class<java.util.Date>> result = null; assertThat(result, is(expected));
Ce code ne parvient pas à se compiler en raison du type d'argument incorrect transmis à la méthode assertThat, qui attend un Matcher étend T> ; au lieu de Matcher
La covariance indique qu'un sous-type peut être attribué en toute sécurité à un supertype. En d’autres termes, une classe étend sérialisable> L'objet peut être affecté à une classe étend T> ; objet. Cependant, l’inverse n’est pas vrai : une classe étend T> ; l'objet ne peut pas être affecté à une classe étend sérialisable> object.
En effet, la covariance ne s'applique qu'au paramètre de type lui-même, pas aux arguments de type qu'il contient. Dans notre exemple, java.util.Date est un sous-type de Serialisable, mais Class étend sérialisable> n'est pas nécessairement un sous-type de Class extends Date>.
Changer la signature de la méthode assertThat en Matcher étend T> ; résout ce problème en autorisant un matcher qui correspond à n'importe quel sous-type du type réel. Cela offre la flexibilité nécessaire pour des situations comme celle de l'extrait de code.
Cependant, il est important de noter qu'il existe des inconvénients potentiels à l'utilisation de
Concernant la généricité de la méthode assertThat, elle permet une vérification de type pour s'assurer que le matcher utilisé est compatible avec le type de résultat. Bien que cela n'élimine pas complètement la possibilité d'erreurs d'exécution, cela ajoute un niveau de sécurité en empêchant les correspondances incompatibles.
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!