Comment puis-je corriger "l'expression de La Liste type de besoins unchecked conversion...'?
Dans le fragment de code Java:
SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<SyndEntry> entries = sf.getEntries();
la dernière ligne génère l'avertissement
", L'expression " de type List
besoins unchecked conversion pour se conformer à List<SyndEntry>
"
Ce qui est un moyen approprié pour résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Depuis
getEntries
retourne un rawList
, il pourrait contenir quoi que ce soit.L'avertissement-gratuit approche est de créer un nouveau
List<SyndEntry>
, alors jetez chaque élément de lasf.getEntries()
résultat àSyndEntry
avant de l'ajouter à votre nouvelle liste.Collections.checkedList
ne pas faire cette vérification pour vous—même s'il aurait été possible de le mettre en œuvre pour le faire.En faisant votre propre cast avant, vous êtes "en respectant les termes de la garantie" de Java génériques: si un
ClassCastException
est soulevé, il va être associé avec un cast dans le code source, pas un invisible cast inséré par le compilateur.C'est un problème courant lorsque vous traitez avec des pré-Java 5 Api. Pour automatiser la solution de erickson, vous pouvez créer le générique de la méthode:
Cela vous permet de faire:
Parce que cette solution vérifie que les éléments ont, en effet, le bon type de l'élément par le biais d'un casting, c'est sûr, et ne nécessite pas de
SuppressWarnings
.Il ressemble
SyndFeed
n'est pas l'utilisation de génériques.Vous pourriez avoir soit un dangereux en fonte et un avertissement de suppression:
ou appelez Les Collections.checkedList - même si vous aurez toujours besoin de supprimer l'avertissement:
Collections.checkedList
permettra d'éviter l'ajout de toute non-SyndEntry éléments plus tard. Personnellement, je n'utilisez pascheckedList
beaucoup, mais alors je n'ai pas souvent dans cette case décochée cast situation de toute façon...Avez-vous écrit le
SyndFeed
?Ne
sf.getEntries
retour Liste ouList<SyndEntry>
? Ma conjecture est qu'il renvoieList
et la modifier pour revenirList<SyndEntry>
va résoudre le problème.Si
SyndFeed
est partie d'une bibliothèque, je ne pense pas que vous pouvez supprimer l'avertissement sans ajouter le@SuppressWarning("unchecked")
annotation à votre méthode.SyndFeed
vient de rometools.github.io/rome/ROMEReleases/ROME1.0Release.html. Le problème semble être résolu dans les versions plus récentes de Rome, comme celles que l'on trouve dans le mvnrepository.com/artifact/com.rometools/rome/1.9.0Si vous utilisez de Goyave et de tout ce que vous voulez faire est de parcourir vos valeurs:
Si vous avez besoin d'une Liste vous pouvez utiliser
ou
Si vous regardez la javadoc de la classe
SyndFeed
(je suppose que vous faites référence à la classecom.sun.syndication.feed.synd.SyndFeed
), la méthode getEntries() ne retourne pasjava.util.List<SyndEntry>
, mais renvoie simplementjava.util.List
.Si vous avez besoin d'un cast explicite pour cette.
Si vous ne voulez pas mettre de @SuppressWarning("unchecked") sur chaque sf.getEntries() l'appel, vous pouvez toujours faire un wrapper qui retourne la Liste.
Voir cette autre question
Encore plus facile
return new ArrayList<?>(getResultOfHibernateCallback(...))