Maison > Java > javaDidacticiel > Pourquoi ne pouvons-nous pas lier les paramètres de type génériques avec « super » en Java ?

Pourquoi ne pouvons-nous pas lier les paramètres de type génériques avec « super » en Java ?

Mary-Kate Olsen
Libérer: 2024-10-31 10:42:29
original
1063 Les gens l'ont consulté

Why Can't We Bound Generic Type Parameters with 'super' in Java?

Délimiter les génériques avec « super » : une explication

Lorsque vous travaillez avec des génériques en Java, il est souvent nécessaire de lier les paramètres de type pour garantir la compatibilité avec des types spécifiques. Le mot-clé 'super' peut être utilisé pour spécifier qu'un paramètre de type doit être une superclasse ou une superinterface d'un type spécifié. Cependant, cette utilisation n'est autorisée qu'avec des caractères génériques, pas avec des paramètres de type.

Dans l'interface Collection, la méthode toArray est déclarée comme :

<T> T[] toArray(T[] a);
Copier après la connexion
Copier après la connexion

Cette méthode permet de convertir une collection d'éléments de type 'T' dans un tableau d'éléments du même type. Cependant, vous ne pouvez pas écrire la méthode comme suit :

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

La raison en est que le mot-clé 'super' dans les génériques est utilisé pour lier les caractères génériques, et non pour saisir les paramètres. Dans l'exemple ci-dessus, vous essayez d'utiliser « super » pour lier le paramètre de type « S » à une superclasse ou une superinterface de « T ». Cette utilisation n'est pas autorisée car elle pourrait potentiellement entraîner des problèmes de sécurité de type.

Par exemple, considérons le code suivant :

List<Integer> integerList = new ArrayList<>();
Integer[] integerArray = new Integer[5];
Number[] numberArray = new Number[5];
Object[] objectArray = new Object[5];
// hypothetical method
integerList.toArray(super T numberArray)
Copier après la connexion

Selon la syntaxe que vous proposez, le code ci-dessus permettrait au affectations de type suivantes :

integerList.toArray(super T integerArray)  // compiles fine!
integerList.toArray(super T numberArray)   // compiles fine!
integerList.toArray(super T objectArray)  // compiles fine!
Copier après la connexion

Cependant, puisque 'String' n'est pas une superclasse de 'Integer', le code suivant ne doit pas être compilé :

integerList.toArray(super T stringArray)  // should not compile
Copier après la connexion

Mais encore une fois, puisque 'Object ' est une superclasse à la fois de 'Integer' et 'String', le code suivant serait toujours compilé, même s'il lèverait une 'ArrayStoreException' au moment de l'exécution :

integerList.toArray(super T stringArray)  // compiles fine!
Copier après la connexion

Ce comportement n'est pas souhaitable car il pourrait conduire pour saisir les violations de sécurité. Pour éviter cela, Java ne vous permet pas d'utiliser « super » pour lier les paramètres de type. Au lieu de cela, vous ne pouvez utiliser « super » que pour lier des caractères génériques.

Par exemple, vous pouvez réécrire la méthode toArray comme suit à l'aide d'un caractère générique :

<T> T[] toArray(T[] a);
Copier après la connexion
Copier après la connexion

Cette méthode vous permet d'écrire du code qui est à la fois sécurisé et flexible. Par exemple, le code suivant se compile et ne génère pas d'exception « ArrayStoreException » au moment de l'exécution :

List<Integer> integerList = new ArrayList<>();
Integer[] integerArray = new Integer[5];
Number[] numberArray = new Number[5];
Object[] objectArray = new Object[5];

integerList.toArray(objectArray);
Copier après la connexion

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