2011-11-26 50 views
0

我有我自己的通用類,它是這樣的不工作我例化了一些類型爲C1的對象:集合通用對象如預期

C1<Integer> a; 
C1<Float> b; 
C1<String> c; 
... 

後來我把它們放在列表中;

list.add(a); 
list.add(b) 
... 

接下來的事情我做的是這樣的: 疊代表這樣做:

list.get(i).setValue(obj); 

其中obj是Object類型的變量,它可以是一個整數,浮點數等

現在存在的問題是,從列表返回的C1實例(讓我們稱之爲c1)被定義爲這樣:

C1<Type1> 

Java將允許這樣的:

c1.setValue(val2); 

其中VAL2的類型是Type2且類型2不等於Type1和是不是即使在同一類層次結構(除了對象OFC)!

編輯: 忘了問這個問題:) 我如何讓setValue「類型安全」,當我上面這樣做的方式訪問?

回答

0

如果存儲在List<C1>類型C1<Type1>C1<Type2>對象,所以無法確定確切的類型,當你檢索列表中的一個元素。您只會知道它是一個C1(與列表中的所有元素一樣)。

如果你真的需要問C1在運行時的類型參數是什麼,你需要存儲一些類型的令牌在C1:

C1<T> { 
    private final Class<T> cls; 

    C1(Class<T> pCls) { 
     cls = pCls; 
    } 

    Class<?> getTypeParameter() { 
     return cls; 
    } 
    } 

然後你就可以在你從列表中得到了實例調用getTypeParameter()並將其與您預期的類型進行比較。

請注意,如果您使用未選中的轉換,這仍然允許您將Type2的值存儲在C1<Type1>中。如果您想消除這種可能性,請檢查val的運行時間類型與setValue()中的cls,如果它們不匹配,則會引發異常。

0

您正在將您的集合定義爲List<C1>,因此無論您如何參數化該類型,它都會接受任何類型爲C1的對象。如果你想將其限制爲只持有一種特定的C1的你需要做的List<C1<Type1>>

+0

嗯,是的,我猜這是問題,但我希望我的集合允許所有C1的無論Type1是什麼(即Type1是Object類型)。我希望這種類型能夠解決我訪問集合成員時的真實情況。我可以用反射來做這件事,但那是最後的手段...... – Paul

+1

你不能兩面都有。如果你想讓這個集合保存任何類型的C1,那麼你不能讓編譯器在編譯時確保類型安全。不過,您可以在運行時使用反射進行檢查。 – Chris