Maison > Java > javaDidacticiel > Pourquoi ne pouvez-vous pas créer directement des tableaux génériques en Java ?

Pourquoi ne pouvez-vous pas créer directement des tableaux génériques en Java ?

Mary-Kate Olsen
Libérer: 2024-12-08 05:37:13
original
403 Les gens l'ont consulté

Why Can't You Directly Create Generic Arrays in Java?

Comment les génériques et les tableaux interagissent

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.

Tableaux et covariance

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 ne peut pas être attribué à List).

Application des types

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é.

Problèmes liés à la création de tableaux génériques

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é.

Pourquoi le transtypage fonctionne

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.

Solutions de contournement pour E[]

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;
}
Copier après la connexion

Wildcard Parameterized Types

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!

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