Maison >Java >javaDidacticiel >Pourquoi ne pouvons-nous pas utiliser le mot-clé « Super » avec des paramètres de type nommés dans les génériques Java ?

Pourquoi ne pouvons-nous pas utiliser le mot-clé « Super » avec des paramètres de type nommés dans les génériques Java ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 10:01:29793parcourir

Why Can't We Use the 'Super' Keyword with Named Type Parameters in Java Generics?

Délimiter les génériques avec le mot-clé contravariant 'Super'

Dans les génériques Java, le mot-clé 'super' joue un rôle essentiel dans l'établissement de sous-types pour paramètres de type. Cependant, il ne peut être utilisé qu'avec des caractères génériques et non avec des paramètres de type nommés. Cela soulève une question courante : pourquoi ?

Pourquoi pas avec les paramètres de type ?

La raison pour laquelle « super » ne peut pas être utilisé avec des paramètres de type est qu'une telle contrainte serait inefficace pour prévenir un comportement inattendu. Object, la superclasse ultime de tous les types de référence, rendrait toute « super » limite hypothétique dénuée de sens dans la pratique.

Par exemple, considérons la méthode hypothétique suivante dans l'interface Collection :

<code class="java"><S super T> S[] toArray(S[] a);</code>

Tenter de déclarer une telle méthode échouerait au moment de la compilation. Même si cela était autorisé, cela n’atteindrait pas son objectif. Étant donné que tous les tableaux de type référence sont des tableaux d'objets, n'importe quel type de tableau peut être utilisé comme argument, rendant la limite « super » inefficace.

Conséquences pour les tableaux

Génériques et les tableaux ont une relation complexe, et l'absence de « super » limites pour les paramètres de type nommé le reflète. Bien qu'il puisse sembler souhaitable de restreindre les tableaux de paramètres uniquement à ceux comportant des superclasses du type paramétré, cela n'est pas possible pour les tableaux.

Par exemple, une 'Liste' devrait, en théorie, accepter uniquement Integer[], Number[] ou Object[] comme arguments de « toArray ». Cependant, en raison de la covariance du tableau, tous les tableaux de type référence sont également des tableaux d'objets. Par conséquent, un 'String[]', qui n'est pas une sous-classe de 'Integer[]', pourrait toujours être transmis à 'toArray', conduisant potentiellement à une 'ArrayStoreException' au moment de l'exécution.

Conclusion

En fin de compte, l'exclusion du mot-clé 'super' des paramètres de type nommé dans les génériques Java est due aux limitations inhérentes aux tableaux dans le contexte des génériques. En interdisant de telles limites, Java empêche les développeurs de créer des contraintes potentiellement trompeuses qui ne parviendraient finalement pas à fournir les garanties de sécurité souhaitées.

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