2013-07-26 35 views
0

我有演員集合<DependantInterface>到收藏<RootInterface>失敗

Interface SpecialData extends RootData { ..}

我不能編譯此操作:

Collection<SpecialData> collSpecData = ...; 
Collection<RootData> collRootData = ...; 
collRootData.add((Collection<RootData>) collSpecData); 

編輯

Collection<SpecialData> collSpecData = ...; 
ArrayList<Collection<RootData>> collRootData = ...; // Correction here : adding ArrayList 
collRootData.add((Collection<RootData>) collSpecData); 

所以,讓我重複SpecialDatacast各個領域?或者是更優雅的解決方案?

回答

4

既然你想所有元素從一個集合添加到另一個,你可以使用Collection#addAll

Collection<SpecialData> collSpecData = ...; 
Collection<RootData> collRootData = ...; 
collRootData.addAll(collSpecData); 

通過你的修改,則可以通過重新定義collRootDataArrayList<Collection<? extends RootData>>速戰速決 。這是一個基於您當前代碼的基本示例:

Collection<SpecialData> collSpecData = new ArrayList<SpecialData>(); 
ArrayList<Collection<? extends RootData>> collRootData = new ArrayList<Collection<? extends RootData>>(); 
collRootData.add(collSpecData); 
+0

你是對的,我在我的問題中犯了一個錯誤:它是'ArrayList >' –

+0

@ cl-r然後編輯你的問題,並添加顯示你的具體問題的代碼,但不刪除以前的內容,否則這其他答案將是無效的。我會根據您的修改更新我的答案。 –

+0

@ cl-r答案已更新。 –

1

是的,你必須迭代和投射每個成員。原因是Collection<RootData>不是Collection<SpecialData>的超類。

其實我建議這樣的:

Collection<SpecialData> collSpecData = //... 
Collection<RootData> collRootData = //empty constructor 
collRootData.addAll(collSpecData); 
0

如果Collection<Bicycle>Collection<Vehicle>,你可以做

Collection<Bicycle> bicycles = ...; 
Collection<Vehicle> vehicles = bicycles; 
vehicles.add(new Car()); 

這將使通用集合類型不安全。

您的方法應該拼湊一個Collection<? extends RootData>作爲參數,因爲您真的不希望此方法向集合添加除SpecialData以外的其他內容。如果這就是你想要的,那麼你需要一個集合的副本,以確保原始集合保持Collection<SpecialData>,並且不包含任何其他內容。

+0

我不能將自行車複製到車輛,因爲我有很多自行車收藏品添加在車輛中。 –

+0

而且?爲什麼有很多集合阻止你複製它們?你爲什麼不簡單地把類型改爲'ArrayList >'? –

+0

對不起,我誤解了我的答案。 Luiggui Mendoza給了我預期的解決方案。 –