How do I fix "The expression of type List needs unchecked conversion...'?

Viewed 225176

In the Java snippet:

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

the last line generates the warning

"The expression of type List needs unchecked conversion to conform to List<SyndEntry>"

What's an appropriate way to fix this?

10 Answers

Since getEntries returns a raw List, it could hold anything.

The warning-free approach is to create a new List<SyndEntry>, then cast each element of the sf.getEntries() result to SyndEntry before adding it to your new list. Collections.checkedList does not do this checking for you—although it would have been possible to implement it to do so.

By doing your own cast up front, you're "complying with the warranty terms" of Java generics: if a ClassCastException is raised, it will be associated with a cast in the source code, not an invisible cast inserted by the compiler.

It looks like SyndFeed is not using generics.

You could either have an unsafe cast and a warning suppression:

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

or call Collections.checkedList - although you'll still need to suppress the warning:

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

Did you write the SyndFeed?

Does sf.getEntries return List or List<SyndEntry>? My guess is it returns List and changing it to return List<SyndEntry> will fix the problem.

If SyndFeed is part of a library, I don't think you can remove the warning without adding the @SuppressWarning("unchecked") annotation to your method.

If you look at the javadoc for the class SyndFeed (I guess you are referring to the class com.sun.syndication.feed.synd.SyndFeed), the method getEntries() doesn't return java.util.List<SyndEntry>, but returns just java.util.List.

So you need an explicit cast for this.

If you don't want to put @SuppressWarning("unchecked") on each sf.getEntries() call, you can always make a wrapper that will return List.

See this other question

The answer of Bruno De Fraine is great. However if the size of input argument "Collection<?> c" is 0 then the routine crashes with null pointer. I suggest a minor improvement to avoid this (and I give the version for HashSet):

public static <T> HashSet<T> castHashSet(Class<? extends T> clazz, Collection<?> c) {
  int cSize = (c == null) ? 0 : c.size();
  HashSet<T> hashSet = new HashSet<T>(cSize);
  if (c != null) {
    for (Object o : c)
      hashSet.add(clazz.cast(o));
    }
    return hashSet;
}
Related