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