Quelle est la signification de l’avertissement de sécurité de type dans certains casts génériques Java ?
-
08-06-2019 - |
Question
Quelle est la signification du Avertissement Java?
Tapez la sécurité :Le transtypage de Object vers List<Integer> vérifie en fait le type effacé List
Je reçois cet avertissement lorsque j'essaie de convertir un objet en un type contenant des informations génériques, comme dans le code suivant :
Object object = getMyList();
List<Integer> list = (List<Integer>) object;
La solution
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, si object
est en fait un List<String>
, il n'y aura pas ClassCastException
au 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 toujours 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;
Notez cependant que vous ne pourrez pas utiliser certaines méthodes comme 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, vous n'aurez qu'à subir le soulignement jaune dans Eclipse (ou un SuppressWarning
annotation).