我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以迭代作为指定类实例的集合的所有成员。它的签名是:
public static <T> Iterable<T> iterable (
Iterable<? super T> source, Class<T> requiredClass);
这适用于大多数用例,但现在我需要将它与泛型类Item<PROTOTYPE>
一起使用。我理解我不能确定生成的迭代器返回的项目不能保证有任何特定的原型,所以我尝试按如下方式转换它的返回:
Iterable<Item<?>> allItems = (Iterable<Item<?>>)
TypeCheckingIterator.iterable(source, Item.class);
不幸的是,这会返回编译器错误“无法从Iterable<Item>
投射到Iterable<Item<?>>
”
为什么在我可以非常愉快地将Item
投射到Item<?>
时,它是否能够执行此演员表?有没有办法可以强制它进行此转换,而不必显式地转换迭代器返回的项目?
答案 0 :(得分:2)
如果您确定安全
,可以使用类型擦除Iterable<Item<?>> allItems = (Iterable<Item<?>>) (Iterable)
TypeCheckingIterator.iterable(source, Item.class);
或
Iterable<Item<?>> allItems =
TypeCheckingIterator.<Item<?>>iterable(source, Item.class);