java warnings unchecked-conversion

java - ¿Cómo corrijo "La expresión de tipo Lista necesita conversión sin marcar..."?



warnings unchecked-conversion (9)

¿ SyndFeed el SyndFeed ?

¿ sf.getEntries List o List<SyndEntry> ? Supongo que devuelve List y lo cambia para devolver List<SyndEntry> 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.

En el fragmento de Java:

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

la última línea genera la advertencia

"La expresión del tipo List necesita una conversión sin List<SyndEntry> para ajustarse a List<SyndEntry> "

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


Aún más fácil

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


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

El enfoque libre de advertencia es crear una nueva List<SyndEntry> 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 genéricos 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 compilador.


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 <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) { List<T> r = new ArrayList<T>(c.size()); for(Object o: c) r.add(clazz.cast(o)); return r; }

Esto le permite hacer:

List<SyndEntry> 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 genéricos.

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

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

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

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


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<SyndEntry> list = Lists.newArrayList( Iterables.filter(sf.getEntries(), SyndEntry.class));

o

List<SyndEntry> 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<SyndEntry> , 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


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