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 extends Number> :
List<? extends Number> foo3 = new ArrayList<Integer>();
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)
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
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
Essentiellement, List étend T> ; garantit que vous ne pouvez que le lire et obtiendrez un T ou une sous-classe de T. Puisque vous ne pouvez pas garantir le type spécifique de la liste, vous ne pouvez pas y ajouter en toute sécurité.
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.
Considérez la signature de Collections.copy() :
public static <T> void copy(List<? super T> dest, List<? extends T> src)
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é.
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!