Maison >Java >javaDidacticiel >Pourquoi la méthode `assertThat` ne parvient-elle pas à se compiler lors de l'utilisation de `Map

Pourquoi la méthode `assertThat` ne parvient-elle pas à se compiler lors de l'utilisation de `Map

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-13 11:54:02208parcourir

Why does the `assertThat` method fail to compile when using `Map

Génériques Java : dans Signatures de méthode

Les génériques Java vous permettent de créer des collections et des méthodes de type sécurisé qui peuvent fonctionner sur une gamme de types de données. Lorsque vous utilisez des génériques, comprendre la différence entre est crucial.

Considérons l'exemple suivant :

Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<Date>> result = null;
assertThat(result, is(expected));

Cet exemple génère une erreur de compilation avec le message suivant :

Error: cannot find symbol method assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>, org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class<? extends java.io.Serializable>>>)

Pourquoi cette version ne parvient-il pas à compiler ?

La raison réside dans l'utilisation de dans la classe Matcher. Dans sa forme originale, assertThat nécessite un Matcher qui correspond au type exact de T. Cependant, dans notre exemple, nous avons une Map of String to Class, où la clé est de type String et la valeur est de type Class. Puisque notre carte de résultats contient Class, qui est un sous-type de Class, le compilateur ne peut pas garantir que Matcher est compatible avec la carte attendue.

Quel est l'inconvénient de changer assertThat en Matcher< ? extends T>?

Changer assertThat en Matcher

Est-il utile de généraliser la méthode assertThat dans JUnit ?

La généralisation de assertThat dans JUnit vise à garantir la sécurité des types et à éviter les inadéquations entre les types attendus et réels. Cependant, comme indiqué ci-dessus, cela peut également entraîner des problèmes potentiels s'il n'est pas utilisé avec précaution.

Recommandation

Lors du choix entre dans les signatures de méthode, il est important de prendre en compte les éléments suivants :

  • Utiliser
  • Utilisez lorsque la méthode nécessite une correspondance de type exacte pour T.

En suivant ces recommandations, vous pouvez éviter les erreurs de compilation et garantir la sécurité des types lors de l'utilisation de génériques Java.

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