如何修复“types列表的expression式需要未经检查的转换…”?
在Java代码片段中:
SyndFeedInput fr = new SyndFeedInput(); SyndFeed sf = fr.build(new XmlReader(myInputStream)); List<SyndEntry> entries = sf.getEntries();
最后一行产生警告
“ List
types的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();