Maison  >  Article  >  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 ?

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
Mary-Kate Olsenoriginal
2024-11-01 09:21:02844parcourir

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);
}

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)

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!

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