Quelle est la signification de l'avertissement de sécurité de type dans certains modèles génériques Java?

Translate

Quelle est la signification duAvertissement Java?

Sécurité de type: le transtypage de l'objet à la liste <Integer> vérifie en fait le type effacé List

J'obtiens cet avertissement lorsque j'essaie de convertir un objet en un type avec des informations génériques, comme dans le code suivant:

Object object = getMyList();
List<Integer> list = (List<Integer>) object;
This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Cet avertissement existe car Java ne stocke pas réellement les informations de type au moment de l'exécution dans un objet qui utilise des génériques. Ainsi, siobjectest en fait unList<String>, il n'y aura pasClassCastExceptionau moment de l'exécution, sauf jusqu'à ce qu'un élément soit accessible à partir de la liste qui ne correspond pas au type générique défini dans la variable.

Cela peut entraîner des complications supplémentaires si des éléments sont ajoutés à la liste, avec ces informations de type générique incorrectes. Tout code contenant encore une référence à la liste mais avec les informations de type générique correctes aura désormais une liste incohérente.

Pour supprimer l'avertissement, essayez:

List<?> list = (List<?>) object;

Cependant, notez que vous ne pourrez pas utiliser certaines méthodes telles que add car le compilateur ne sait pas si vous essayez d'ajouter un objet de type incorrect. Ce qui précède fonctionnera dans de nombreuses situations, mais si vous devez utiliser add, ou une méthode similaire restreinte, vous devrez simplement subir le soulignement jaune dans EclipseSuppressWarningannotation).

La source