¿Cómo corrijo “La expresión de tipo Lista necesita conversión sin marcar …”?

En el fragmento de Java:

SyndFeedInput fr = new SyndFeedInput(); SyndFeed sf = fr.build(new XmlReader(myInputStream)); List entries = sf.getEntries(); 

la última línea genera la advertencia

“La expresión del tipo List necesita una conversión sin List para ajustarse a List

¿Cuál es una forma apropiada de arreglar esto?

Como getEntries devuelve una List sin getEntries , podría contener cualquier cosa.

El enfoque libre de advertencia es crear una nueva List y luego convertir cada elemento del resultado sf.getEntries() en SyndEntry antes de agregarlo a su nueva lista. Collections.checkedList no hace esta comprobación por usted, aunque hubiera sido posible implementarlo para hacerlo.

Al hacer su propio lanzamiento, está “cumpliendo con los términos de garantía” de los generics de Java: si se ClassCastException una ClassCastException , se asociará con un molde en el código fuente, no con un yeso invisible insertado por el comstackdor.

Este es un problema común cuando se trata de APIs anteriores a Java 5. Para automatizar la solución de erickson , puede crear el siguiente método genérico:

 public static  List castList(Class< ? extends T> clazz, Collection< ?> c) { List r = new ArrayList(c.size()); for(Object o: c) r.add(clazz.cast(o)); return r; } 

Esto le permite hacer:

 List entries = castList(SyndEntry.class, sf.getEntries()); 

Debido a que esta solución comprueba que los elementos tienen el tipo de elemento correcto por medio de un molde, es seguro y no requiere SuppressWarnings .

Parece que SyndFeed no usa generics.

Usted podría tener un yeso inseguro y una supresión de advertencia:

 @SuppressWarnings("unchecked") List entries = (List) sf.getEntries(); 

o llame a Collections.checkedList , aunque aún deberá suprimir la advertencia:

 @SuppressWarnings("unchecked") List entries = Collections.checkedList(sf.getEntries(), SyndEntry.class); 

¿ SyndFeed el SyndFeed ?

¿ sf.getEntries List o List ? Supongo que devuelve List y lo cambia para devolver List que solucionará el problema.

Si SyndFeed es parte de una biblioteca, no creo que pueda eliminar la advertencia sin agregar la @SuppressWarning("unchecked") a su método.

Si está usando Guava y todo lo que quiere hacer es iterar a través de sus valores:

 for(SyndEntry entry: Iterables.filter(sf.getEntries(), SyndEntry.class){ ... } 

Si necesita una lista real, puede usar

 List list = Lists.newArrayList( Iterables.filter(sf.getEntries(), SyndEntry.class)); 

o

 List list = ImmutableList.copyOf( Iterables.filter(sf.getEntries(), SyndEntry.class)); 

Si miras el javadoc para la clase SyndFeed (supongo que te refieres a la clase com.sun.syndication.feed.synd.SyndFeed ), el método getEntries () no devuelve java.util.List , pero devuelve solo java.util.List .

Entonces necesitas un elenco explícito para esto.

Si no desea poner @SuppressWarning (“desmarcado”) en cada llamada a sf.getEntries (), siempre puede crear un contenedor que devuelva List.

Ver esta otra pregunta

Aún más fácil

return new ArrayList< ?>(getResultOfHibernateCallback(...))

 SyndFeedInput fr = new SyndFeedInput(); SyndFeed sf = fr.build(new XmlReader(myInputStream)); List< ?> entries = sf.getEntries();