如何修复“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();