2011-07-15 5 views
1

"BaseCatalog"と "City"の2つのクラスがあります。 "BaseCatalog"は "City"の親クラスであり、 "City"は "BaseCatalog"クラスを拡張しています。java.util.Listの要素の型入れ

"getBaseCatalogObjects"という1つのパラメータcatalogTypeをとるメソッドがあり、 はBaseCatalogオブジェクトのリストを返します。与えられた型によれば、Listの型は異なるかもしれませんが、常にBaseCatalogクラスを拡張するオブジェクトを含んでいます。

このメソッドは汎用メソッドであるため、常にBaseCatalogオブジェクトを含むListを生成します。しかし、この場合には、私は、リスト内の各BaseCatalogインスタンスはまた、市のオブジェクトであると確信しています:

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

私は何をしたいことは何かである「cityObjects」と呼ばれるリストには、この「baseCatalogObjects」リストを変換することです以下のような:

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

ことが可能ですか「baseCatalogobjectsを」新しいjava.util.Listのインスタンスを作成し、リストを反復処理することなく、このような変換を行うための任意の効率的な方法がありますか?

答えて

1

そして、あなたはあなたをキャストすることができます

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

お手伝いします:) –

3

すべての要素が都市であることを「知っている」場合は、タイプ消去を使用できます。

List<City> cityObjects = (List) baseCatalogObjects; 

またはあなたはまた、彼らは右のタイプです確認することができ、検索に必要な型を渡すことができます(これは、あなたがオフにすることができ、警告を与えます)。

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

実際には、CatalogTypeが冗長であることがあります。

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

、次のようにあなたが何かにあなたのメソッドのシグネチャを変更することができますピーターによって示唆されるように

City[] cityArr = baseCatalogObjects.toArray(new City[0]); 
List<City> cityObjects = Arrays.asList(cityArr); 
+1

リスト cityObjects =(List)baseCatalogObjectsは、「未チェック」の警告を表示しないと機能します。ありがとう。 – ozgur

0

あなたはこのような何かをやって試すことができますreturn文のように、

(List<T>) list; 

これは役に立ちます。

関連する問題