Maison > Java > javaDidacticiel > Pourquoi ne puis-je pas ajouter des éléments à une liste

Pourquoi ne puis-je pas ajouter des éléments à une liste

Susan Sarandon
Libérer: 2024-12-18 09:05:10
original
613 Les gens l'ont consulté

Why Can't I Add Elements to a List

Comprendre la liste Structures de données

En Java, comprendre les limites de l'utilisation de caractères génériques avec des génériques est crucial. Examinons le problème spécifique de l'ajout d'éléments à une liste déclarée comme List :

List<? extends Number> foo3 = new ArrayList<Integer&gt();
Copier après la connexion

Lorsque vous essayez d'ajouter un entier à foo3, vous pouvez rencontrer une erreur similaire à :

The method add(capture#1-of ? extends Number) in the type List<capture#1-of ?
extends Number> is not applicable for the arguments (ExtendsNumber)
Copier après la connexion

Pourquoi vous ne pouvez pas ajouter à la liste

Le caractère générique ? étend le numéro dans la liste ? étend Nombre> foo3 implique que foo3 peut contenir des valeurs d'une famille de types qui étendent Number. Cela signifie que les affectations suivantes sont toutes valides :

List<? extends Number> foo3 = new ArrayList<Number>(); // Number extends Number
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>(); // Double extends Number
Copier après la connexion

Cependant, compte tenu de cette flexibilité, il devient impossible de déterminer avec certitude quel type d'objet vous pouvez ajouter à foo3 sans violer son intégrité. L'ajout d'un entier est interdit car foo3 pourrait pointer vers une liste. De même, l'ajout d'un Double est interdit car foo3 pourrait faire référence à une List.

La garantie de l'abstraction

Essentiellement, List

En revanche, List< ;? super T> vous permet d'ajouter des valeurs de type T ou de ses sous-classes car vous pouvez être certain que la liste peut contenir ces valeurs sans violer sa sécurité de type.

Exemple : Comprendre Collections.copy()

Considérez la signature de Collections.copy() :

public static <T> void copy(List<? super T> dest, List<? extends T> src)
Copier après la connexion

Remarquez comment le caractère générique pour src (? extends T) vous permet de transmettre n'importe quelle liste qui contient valeurs de type T ou ses sous-classes, garantissant que les valeurs produites par src seront de type T ou ses sous-classes. Cela permet à la méthode de traiter différents types de listes, en copiant les valeurs en toute sécurité.

Conclusion

Comprendre les limites de l'utilisation de caractères génériques avec des génériques est essentiel pour écrire du code Java robuste. N'oubliez pas que vous ne pouvez pas ajouter d'éléments à une liste ? étend T> ; car vous ne pouvez pas garantir le type spécifique de la liste vers laquelle il pointe. Au lieu de cela, vous pouvez uniquement le lire et être assuré d'obtenir des valeurs de type T` ou de ses sous-classes.

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