如何修复“types列表的expression式需要未经检查的转换…”?

在Java代码片段中:

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

最后一行产生警告

Listtypes的expression式需要进行未经检查的转换以符合List<SyndEntry>

什么是解决这个问题的适当方法?

由于getEntries返回一个原始List ,它可以容纳任何东西。

没有警告的方法是创build一个新的List<SyndEntry> ,然后将sf.getEntries()结果的每个元素sf.getEntries()SyndEntry然后将其添加到新列表中。 Collections.checkedList不会检查你,虽然它可能会实现它。

通过做自己的努力,你可以“遵守Javagenerics的保证条款”:如果引发ClassCastException ,它将与源代码中的强制转换相关联,而不是由编译器插入的不可见转换。

处理Java 5之前的版本时,这是一个常见的问题。 为了使erickson的解决scheme实现自动化,您可以创build以下通用方法:

 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; } 

这可以让你做到:

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

因为这个解决scheme通过强制转换检查元素是否确实具有正确的元素types,所以它是安全的,并且不需要SuppressWarnings

它看起来像SyndFeed不使用generics。

你可以有一个不安全的演员和一个警告抑制:

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

或者调用Collections.checkedList – 虽然你仍然需要禁止警告:

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

你写了SyndFeed吗?

sf.getEntries是否返回List或List<SyndEntry> ? 我的猜测是它返回List并将其更改为返回List<SyndEntry>将解决问题。

如果SyndFeed是一个库的一部分,我不认为你可以删除警告,而不添加@SuppressWarning("unchecked")注释到您的方法。

如果你正在使用番石榴,你想要做的是迭代你的价值观:

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

如果你需要一个实际的列表,你可以使用

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

要么

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

如果您查看类SyndFeed的javadoc(我想您是指com.sun.syndication.feed.synd.SyndFeed类),getEntries()方法不会返回java.util.List<SyndEntry> ,但只返回java.util.List

所以你需要明确的演员。

如果您不想在每个sf.getEntries()调用中放置@SuppressWarning(“unchecked”),则始终可以创build一个将返回List的包装器。

看到这个问题

更容易

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

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