Maison  >  Article  >  Java  >  Pourquoi ne pouvons-nous pas utiliser le mot-clé « super » pour les limites des paramètres de type dans les génériques Java ?

Pourquoi ne pouvons-nous pas utiliser le mot-clé « super » pour les limites des paramètres de type dans les génériques Java ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 16:22:30182parcourir

Why Can't We Use 'super' Keyword for Type Parameter Bounds in Java Generics?

Génériques délimitants avec mot-clé « super » : une explication complète

Les génériques Java permettent la sécurité des types et la réutilisabilité du code. Un aspect des génériques est la délimitation de type, où un paramètre de type peut être limité à une relation de sous-type spécifique. Cependant, contrairement aux caractères génériques, les paramètres de type ne peuvent pas être limités à l'aide du mot-clé 'super'.

Dans l'interface Collection, la méthode toArray prend un argument de type 'S[]', 'S' étant un paramètre de type. La question se pose de savoir pourquoi la méthode n'est pas déclarée comme '' au lieu d'un caractère générique ''.

La réponse réside dans le comportement du « super » bounding. Alors que 'super' est généralement utilisé avec des caractères génériques (<'? super T'>), son application aux paramètres de type (<'' au lieu de '>) a une conséquence involontaire. Object est la superclasse de tous les types de référence, ce qui signifie que 'Object[]' est un argument valide pour '<'S super T>>' au moment de la compilation. Cela va à l'encontre de l'objectif de la limite, car n'importe quel argument de type référence pourrait être transmis, même ceux qui ne sont pas des sous-classes de « T ».

Par conséquent, une « super » limite sur les paramètres de type ne fournirait pas la protection attendue contre arguments invalides. Pour illustrer, la méthode hypothétique '<> S[] toArray(S[] a)' avec '' car 'Integer' autoriserait toujours un argument de type 'String[]', bien que 'String' ne soit pas une superclasse de 'Integer'. Puisque 'String[]' est un 'Object[]', il satisferait la limite 'super'.

Cette limitation découle de l'interaction entre les génériques et les tableaux. Les génériques et les tableaux ont des règles de covariance différentes, conduisant au comportement observé.

Il est important de noter que cette limitation s'applique uniquement aux paramètres de type. Les caractères génériques peuvent toujours être liés à l'aide de « super » pour exprimer la variance, comme le montre « < » ? super T> ;' dans la méthode toArray, permettant une plus grande flexibilité.

Pour plus d'informations sur les génériques et la délimitation des types, reportez-vous aux ressources suivantes :

  • Tutoriels Java/Génériques
  • Java Generics : Qu'est-ce que PECS ?
  • Quelle est la différence entre super et extends dans Java Generics

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