"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi ne puis-je pas ajouter d'éléments à une collection Java avec un type générique générique (`? extends Parent`) ?

Pourquoi ne puis-je pas ajouter d'éléments à une collection Java avec un type générique générique (`? extends Parent`) ?

Publié le 2024-12-17
Parcourir:662

Why Can't I Add Elements to a Java Collection with a Wildcard Generic Type (`? extends Parent`)?

Sécurité des types et génériques génériques : comprendre le modificateur interdit

Lorsque vous travaillez avec des collections génériques en Java, le concept de génériques génériques peut introduire certains des limitations qui peuvent sembler contre-intuitives à première vue. Un bon exemple est l'incapacité d'ajouter des valeurs à une collection Java avec un type générique générique.

Considérez l'extrait de code suivant :

List extends Parent> list = ...;
Parent p = factory.get(); // returns concrete implementation
list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)

Pourquoi ce code ne parvient-il pas à se compiler ? La réponse réside dans les mécanismes de sécurité inhérents qui sont appliqués par les génériques génériques.

Le principe de récupération sans restriction et d'ajout restreint

Le type générique générique, noté ? étend Parent, représente une liste d'éléments qui sont des descendants de l'interface Parent. Bien qu'elle permette une récupération sans restriction de ces éléments, la sécurité des types dicte des restrictions sur l'ajout de valeurs à la collection.

Si le code était autorisé à se compiler, il permettrait l'affectation d'une instance Parent à un élément de la liste. Cependant, cette action pourrait potentiellement rompre la sécurité des types.

Considérez le scénario suivant :

List childList = new ArrayList();
childList.add(new Child());

List extends Parent> parentList = childList;
parentList.set(0, new Parent());

Child child = childList.get(0); // No! It's not a child! Type safety is broken...

Dans ce scénario, une liste d'objets enfants est convertie en une liste de ? » étend Parent. L'affectation ultérieure d'une instance Parent au premier élément de la liste viole la sécurité des types, car la liste résultante contient un élément qui n'est pas une instance Enfant valide.

Garantir la sécurité des types immuables

En interdisant l'ajout de valeurs aux collections génériques génériques, Java applique la sécurité des types immuables. Cela garantit que les éléments de la liste respectent toujours les contraintes imposées par leur type déclaré.

En l'absence de cette restriction, la sécurité du type serait compromise, entraînant des erreurs potentielles et un comportement inattendu.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3