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.
SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<?> entries = sf.getEntries();