Complications des types génériques génériques
Les génériques génériques Java fournissent un moyen de représenter les types sans s'engager sur un type concret spécifique. Bien que cette flexibilité puisse être puissante, elle peut également conduire à un comportement inattendu.
Considérons l'exemple suivant, où une liste Java d'un sous-type inconnu de l'interface Parent est définie :
List<? extends Parent> list = ...;
Le système de types de Java ne permettra cependant pas d'ajouter une instance Parent à cette liste :
Parent p = factory.get(); // returns concrete implementation list.set(0, p); // compilation error
Cette apparente contradiction découle du concept de sécurité des types. Autoriser l’ajout d’une instance Parent à la liste compromettrait l’intégrité du type générique générique. Voici pourquoi :
Imaginez si cet ajout était autorisé. Supposons que nous ayons une liste d'instances Child, qui sont un sous-type concret de Parent :
List<Child> childList = new ArrayList<Child>(); childList.add(new Child());
Si nous devions attribuer cette childList à notre liste avec le type générique générique, il semblerait que nous ayons une liste d'instances Parent :
List<? extends Parent> parentList = childList;
Cependant, nous pourrions alors potentiellement ajouter une instance Parent à cette parentList :
parentList.set(0, new Parent());
Cela permettrait provoquer une violation de sécurité de type catastrophique. Lors de la récupération ultérieure de l'élément à l'index 0 de la childList, nous nous attendrions à ce qu'il s'agisse d'une instance Child, mais il s'agirait en fait d'une instance Parent, ce qui entraînerait un comportement inattendu.
Pour éviter cette violation de sécurité de type, Java applique la règle selon laquelle vous ne pouvez ajouter que des instances du type générique générique lui-même à la liste, même si vous pouvez récupérer des instances de son supertype. Cette restriction garantit l'intégrité du paramètre de type et évite les bugs potentiels.
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!