如何修复“类型列表的表达式需要未经检查的转换...”?

新手上路,请多包涵

在 Java 片段中:

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

最后一行生成警告

“类型 List 的表达式需要未经检查的转换以符合 List<SyndEntry>

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

原文由 user46277 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 896
2 个回答

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

无警告的方法是创建一个新的 List<SyndEntry> ,然后将 --- 结果的每个元素转换为 SyndEntry sf.getEntries() 结果,然后再将其添加到新列表中。 Collections.checkedList 不会 为你做这个检查——尽管它本来可以实现的。

通过预先进行自己的转换,您将“遵守 Java 泛型的保证条款”:如果引发 ClassCastException ,它将与源代码中的转换相关联,而不是不可见的转换由编译器插入。

原文由 erickson 发布,翻译遵循 CC BY-SA 2.5 许可协议

这是处理 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;
}

这使您可以:

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

因为此解决方案通过强制转换检查元素确实具有正确的元素类型,所以它是安全的,并且不需要 SuppressWarnings

原文由 Bruno De Fraine 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题