Les génériques sont l'une des caractéristiques les plus controversées du langage Java. Ils permetent à un type ou à une méthode de fonctionner sur des objets de différents types tout en offrant une sécurité de type à la compilation, faisant de Java un langage entièrement typé statiquement. Dans cet article, je vais parler de cinq choses que tous les développeurs Java devraient connaître les génériques.
Les génériques sont implémentés à l'aide de l'effacement de type
En Java, une classe ou une interface peut être déclarée pour définir un ou plusieurs paramètres de type et ces paramètres de type doivent être fournis au moment de la construction de l'objet. Par exemple:
Les génériques ne supportent pas le sous-typage
Un générique ne prend pas en charge le sous-typage, ce qui signifie que List n'est pas considéré comme un sous-type de List, où S est un sous-type de T. Par exemple:
Vous ne pouvez pas créer de tableaux génériques
Vous ne pouvez pas créer de tableaux génériques comme indiqué ci-dessous, car les tableaux contiennent des informations de type à l'exécution sur le type d'éléments. Les tableaux utilisent ces informations au moment de l'exécution pour vérifier le type de l'objet qu'il contient et lancera ArrayStoreException si le type ne correspond pas. Mais avec les génériques, les informations de type sont effacées et la vérification de tableaux réussit alors qu'elle devait échouer.
Les tableaux se comportent différemment des collections car les tableaux sont covariants par défaut, ce qui signifie que S [] est un sous-type de T [] quand S est un sous-type de T, et donc les génériques ne supporte pas la covariance. Ainsi, si le code ci-dessus avait été compilé, la vérification du tableaux réussirait alors qu'elle devait échouer. Par exemple,
L'utilisation de caractères génériques avec extend ou super pour augmenter la flexibilité de l'API
Il y a des moments où vous devez travailler non seulement avec T, mais aussi avec des sous-types de T. Par exemple, la méthode addAll dans l'interface Collection qui ajoute tous les éléments de la collection spécifiée à la collection sur laquelle elle est appelée. La méthode addAll a la signature suivante:
Dans cette méthode, vous ajoutez des éléments de type T à la collection c. super est utilisé à la place de extends parce que les éléments sont ajoutés dans la collection c alors que dans l'exemple précédent de l'interface Collection les éléments de la méthode addAll ont été lus dans la collection. Dans le livre Java efficace, Joshua Bloch appelle ceci par PECS.
PECS signifie Producteur Extends, Consommateur Super. Il s'avère très utile chaque fois que vous êtes confus quant à savoir si vous devez utiliser étend ou super.
Aucun commentaire