Maison  >  Article  >  Java  >  Pourquoi le mot-clé « super » est-il limité aux caractères génériques et non aux paramètres de type dans les génériques Java ?

Pourquoi le mot-clé « super » est-il limité aux caractères génériques et non aux paramètres de type dans les génériques Java ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 07:20:02687parcourir

Why is the `super` keyword restricted to wildcards and not type parameters in Java generics?

Délimitation des génériques avec le mot-clé « super »

On pourrait se demander pourquoi le mot-clé super n'est applicable qu'aux caractères génériques et non aux paramètres de type dans les génériques Java . Considérons l'exemple suivant dans l'interface Collection, où la méthode toArray n'est pas déclarée comme ceci :

interface Collection<T> {
    <S super T> S[] toArray(S[] a);
}

Cette syntaxe conduirait à une déclaration illégale, et comprendre la raison nécessite d'explorer les implications de l'utilisation de super avec nommé paramètres de type.

La limitation de « super » dans les paramètres de type

L'utilisation de super pour délimiter un paramètre de type nommé () n'atteindrait pas les effet escompté. Puisque Object est la superclasse ultime de tous les types référence, n’importe quel tableau de type référence peut être converti en Object[]. Cela signifie que même avec la syntaxe hypothétique, le code suivant serait toujours compilé et entraînerait une ArrayStoreException au moment de l'exécution :

List<Integer> integerList;
integerList.toArray(new String[0]);  // should be disallowed, but compiles

Par conséquent, super n'est pas autorisé avec des paramètres de type nommés pour éviter l'illusion d'une application qui ne peut pas être garanti.

Génériques et tableaux : une relation complexe

Un autre aspect à considérer est l'interaction complexe entre les génériques et les tableaux. En Java, les tableaux sont traités différemment des autres types de collections, ce qui entraîne des limitations dans l'application de la sécurité des types. Cela explique pourquoi les limites de type générique ne peuvent pas empêcher ArrayStoreException dans l'exemple donné.

Exemples de délimitation illégale avec 'super'

Pour illustrer davantage le problème, considérons une méthode hypothétique déclaration :

<T super Integer> void add(T number)  // hypothetical! currently illegal

Avec cette syntaxe, on pourrait s'attendre à ce qu'elle accepte les instances Integer et Number, mais pas String. Cependant, étant donné que String est une sous-classe d'Object et que Object est une superclasse d'Integer, il serait toujours possible pour add(aString) de compiler, ce qui entraînerait des erreurs potentielles.

Conclusion

En conclusion, l'utilisation de super avec des paramètres de type nommés est restreinte pour garantir la sécurité du type et éviter les hypothèses invalides. Les génériques et les tableaux en Java ont des caractéristiques uniques qui limitent l'efficacité des paramètres de type de délimitation avec super.

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