Bien que vous puissiez créer une référence de tableau avec un type générique (éléments E[]), créer un objet tableau avec un type générique ( elements = new E[10]) est interdit. Cela est dû à des différences fondamentales dans la façon dont les génériques et les tableaux gèrent l'application du type.
Contrairement aux génériques, les tableaux sont covariants. Cela signifie qu'un tableau d'un supertype (par exemple, Object[]) peut être affecté à un tableau d'un sous-type (par exemple, String[]). Ce n'est pas le cas des génériques, qui imposent l'invariance (par exemple, List
Les génériques appliquent des contrôles de type plus stricts au moment de la compilation. , empêchant les exceptions d'exécution et préservant la sécurité des types. Cependant, les tableaux contiennent des informations de type d'exécution, ce qui entraîne des ArrayStoreExceptions potentielles si un élément d'un type incompatible est inséré.
Création d'un tableau avec un type de composant générique (par ex. , T[]) n'est pas sûr car le type n'est pas connu au moment de l'exécution. Cela peut entraîner des erreurs de transtypage ou des ArrayStoreExceptions, car le tableau créé peut en fait être un Object[] déguisé.
Vous vous demandez peut-être pourquoi elements = (E[]) new Object[10] semble fonctionner. Cela est dû à un transtypage de type non contrôlé, qui supprime les avertissements au moment de la compilation mais comporte toujours le risque d'exceptions d'exécution. Dans ce cas, la conversion peut réussir si les éléments du tableau sont compatibles avec le type générique, mais cela peut ne pas toujours fonctionner.
Pour créer un tableau d'un type générique tapez sans compter sur un casting non vérifié, utilisez la méthode Array#newInstance() :
public <E> E[] getArray(Class<E> clazz, int size) { @SuppressWarnings("unchecked") E[] arr = (E[]) Array.newInstance(clazz, size); return arr; }
La création d'un tableau de types paramétrés par caractères génériques (par exemple, List>[]) est autorisée car les caractères génériques sont des types réifiables qui conservent leur paramétrage au moment de l'exécution. Par exemple, List>[] est équivalent à List[].
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!