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

2022-08-31 07:37:28

在 Java 代码片段中:

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

最后一行生成警告

“类型的表达式需要未经检查的转换才能符合ListList<SyndEntry>"

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


答案 1

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


答案 2

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

无警告的方法是创建一个新的,然后在将其添加到新列表之前将结果的每个元素强制转换为。 不会为您执行此检查 - 尽管可以实现它来执行此操作。List<SyndEntry>sf.getEntries()SyndEntryCollections.checkedList

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


推荐