use*_*277 129 java warnings unchecked-conversion
在Java片段中:
SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<SyndEntry> entries = sf.getEntries();
Run Code Online (Sandbox Code Playgroud)
最后一行生成警告
"类型的表达式List
需要未经检查的转换以符合List<SyndEntry>
"
有什么方法可以解决这个问题?
Bru*_*ine 111
在处理Java 5之前的API时,这是一个常见问题.要从erickson自动化解决方案,您可以创建以下通用方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
这允许你这样做:
List<SyndEntry> entries = castList(SyndEntry.class, sf.getEntries());
Run Code Online (Sandbox Code Playgroud)
因为此解决方案通过强制转换检查元素确实具有正确的元素类型,所以它是安全的,并且不需要SuppressWarnings
.
eri*_*son 94
由于getEntries
返回原始List
,它可以保留任何东西.
无警告方法是创建一个新的List<SyndEntry>
,然后在将sf.getEntries()
结果SyndEntry
添加到新列表之前将结果的每个元素转换为.Collections.checkedList
并没有做这个检查你-虽然它本来可以实现它这样做.
通过自己的预测,您"遵守Java泛型的保修条款":如果ClassCastException
引发了a ,它将与源代码中的强制转换关联,而不是编译器插入的不可见转换.
Jon*_*eet 25
看起来好像SyndFeed
没有使用泛型.
你可能有不安全的演员阵容和警告抑制:
@SuppressWarnings("unchecked")
List<SyndEntry> entries = (List<SyndEntry>) sf.getEntries();
Run Code Online (Sandbox Code Playgroud)
或者调用Collections.checkedList - 尽管你仍然需要禁止警告:
@SuppressWarnings("unchecked")
List<SyndEntry> entries = Collections.checkedList(sf.getEntries(), SyndEntry.class);
Run Code Online (Sandbox Code Playgroud)
你写过了SyndFeed
吗?
是否sf.getEntries
返回列表或List<SyndEntry>
?我的猜测是返回List
并将其更改为返回List<SyndEntry>
将解决问题.
如果SyndFeed
是库的一部分,我认为如果不在@SuppressWarning("unchecked")
方法中添加注释,就不能删除警告.