Maison > Java > javaDidacticiel > Pourquoi le mot-clé \'super\' ne peut-il pas être utilisé pour lier les paramètres de type dans les génériques Java ?

Pourquoi le mot-clé \'super\' ne peut-il pas être utilisé pour lier les paramètres de type dans les génériques Java ?

Mary-Kate Olsen
Libérer: 2024-11-01 09:21:02
original
984 Les gens l'ont consulté

Why can't the 'super' keyword be used to bound type parameters in Java generics?

Délimiter les génériques avec le mot-clé « super » : une explication détaillée

Question :Pourquoi le mot-clé « super » ne peut-il pas être utilisé pour paramètres de type liés, contrairement aux caractères génériques ?

Réponse :

La délimitation d'un paramètre de type avec « super » (par exemple, «  ») n'est pas autorisée dans Java, car il aurait effectivement un impact négligeable sur le type lié et ne servirait pas son objectif.

Considérez le code hypothétique suivant :

interface Collection<T> {
    <S super T> S[] toArray(S[] a);
}
Copier après la connexion

Ce code propose que la méthode 'toArray' dans l'interface 'Collection' doit avoir un paramètre de type 'S' qui est un supertype de 'T'. Cependant, cette limite n'aurait aucun sens car chaque type est un supertype de « Objet », et comme un tableau de n'importe quel type de référence peut être converti en un « Objet[] », le compilateur permettrait à n'importe quel tableau d'être passé comme argument à 'toArray', qu'il s'agisse ou non d'un sous-type prévu.

Par conséquent, l'utilisation de 'super' pour lier les paramètres de type n'empêcherait pas les erreurs d'exécution, telles que 'ArrayStoreException'. En tant que tel, il n'est pas autorisé dans le système de types de Java.

Exemple :

Considérons une méthode générique hypothétique :

<T super Integer> void add(T number)
Copier après la connexion

Cette méthode vise pour autoriser l'ajout de "entiers", de "nombres" et d'"objets" (car ce sont tous des superclasses de "Integer") mais interdire les "chaînes" car elles ne le sont pas. Cependant, étant donné que « Object » est une superclasse de « Integer », des « chaînes » peuvent toujours être ajoutées en raison d'un casting implicite, entraînant des erreurs d'exécution potentielles.

Considérations supplémentaires :

  • Génériques et tableaux : Les génériques et les tableaux ont des limites inhérentes et ils ne se mélangent pas de manière transparente.
  • Alternatives à l'utilisation de « super » : Pour Pour garantir la sécurité des types dans de tels scénarios, il est recommandé d'utiliser des caractères génériques ou une surcharge de méthodes au lieu de limiter les paramètres de type avec « super ».

Ressources associées :

  • Tutoriels Java/Génériques

    • Sous-typage
    • Plus de plaisir avec les caractères génériques
  • Génériques Java : Qu'est-ce que PECS ? (Le producteur étend le super consommateur)
  • Quelle est la différence entre super et étend 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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal