2011-07-15 39 views
1

我有兩個名爲「BaseCatalog」和「City」的類。 「BaseCatalog」是「City」的父類,換句話說,「City」擴展了「BaseCatalog」類。java.util.List中的類型轉換元素

我有一個名爲「getBaseCatalogObjects」的方法,它接受一個參數catalogType,並返回一個BaseCatalog對象列表。根據給定的類型,列表的類型可能不同,但它總是包含擴展主要BaseCatalog類的對象。

由於此方法是一種通用方法,因此它總是生成一個包含BaseCatalog對象的List。然而,在這種情況下,我肯定列表中的每個BaseCatalog實例也是一個城市對象:

List<BaseCatalog> baseCatalogObjects = getBaseCatalogObjects(CatalogType.CITY); 

我想要做的就是這個「baseCatalogObjects」列表轉換到一個名爲「cityObjects」名單這是一件好事像:

List<City> cityObjects = (List<City>) baseCatalogObjects; 

是否有可能或有任何有效的方式做到這樣那樣的轉換,而無需創建一個新的java.util.List實例,並遍歷目錄「baseCatalogobjects」?

回答

1

至於建議由彼得,你可以在你的方法簽名更改爲如下,

public <T extends BaseCatalog> List<T> getBaseCatalogObjects(Class<T> clazz, CatalogType type){} 

然後你就可以投你列表中的退貨說明,

(List<T>) list; 

希望這有助於!

+0

高興地幫助:) –

3

如果你「知道」所有的元素是城市,你可以使用類型刪除。 (這給了你,你可以關閉警告)

List<City> cityObjects = (List) baseCatalogObjects; 

,或者你可以傳遞所需類型的搜索也可以檢查它們是正確的類型。

List<City> cityObjects = getBaseCatalogObjects(City.class, CatalogType.CITY); 

實際上,您可能會發現CatalogType是多餘的。

List<City> cityObjects = getBaseCatalogObjects(City.class); 
+1

列表 cityObjects =(List)baseCatalogObjects在我禁止「未檢查」警告時有效。謝謝。 – ozgur

0

你可以嘗試做這樣的事情:

City[] cityArr = baseCatalogObjects.toArray(new City[0]); 
List<City> cityObjects = Arrays.asList(cityArr); 
相關問題