2012-07-22 128 views
1

我有,需要一个集合和一个类的对象,并返回一个可迭代实例可以遍历是指定类的实例集合中的所有成员我的实用工具类的一个方法。它的签名是:如何将泛型类型转换为具有泛型参数的泛型类型?

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<?>?有没有一种方法可以强制它进行这种转换,而不必明确地转换迭代器返回的项目?

+0

杜佩:http://stackoverflow.com/q/10869467/774444 – 2012-07-22 11:31:32

+0

@LouisWasserman哪个遭完全相同的问题.. – 2012-07-22 11:53:55

回答

2

您可以使用类型擦除如果你确定它的安全

Iterable<Item<?>> allItems = (Iterable<Item<?>>) (Iterable) 
         TypeCheckingIterator.iterable(source, Item.class); 

Iterable<Item<?>> allItems = 
        TypeCheckingIterator.<Item<?>>iterable(source, Item.class); 
+0

我不能让你的第二个解决方案工作。出现错误:TypeCheckingIterator类型的参数化方法> iterable(Iterable <?super >,>类)不适用于参数(Iterable ,类)。不知道是什么问题,PositionedObject绝对是项 Jules 2012-07-22 11:36:24

+0

,变化在第一溶液中铸件的超类(可迭代>)(可迭代)避免了原始类型的警告。 – Jules 2012-07-22 11:40:17

+0

它不是所有的项目''是相等的。我会尝试引入了''通配符,因为我看不出它如何帮助你。 – 2012-07-22 11:41:01