2012-07-22 130 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