1

「BaseCatalog」と「City」という名前の2つのクラスがあります。「BaseCatalog」は「City」の親クラスです。つまり、「City」は「BaseCatalog」クラスを拡張します。

「getBaseCatalogObjects」というメソッドがあります。このメソッドは、1つのパラメーターcatalogTypeを受け取り、BaseCatalogオブジェクトのリストを返します。指定されたタイプに応じて、リストのタイプは異なる場合がありますが、メインのBaseCatalogクラスを拡張するオブジェクトが常に含まれています。

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

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

私がやりたいのは、この「baseCatalogObjects」リストを「cityObjects」というリストに変換することです。これは次のようなものです。

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

新しいjava.util.Listインスタンスを作成してリスト「baseCatalogobjects」を反復処理せずに、このような変換を行うための効率的な方法はありますか?

4

3 に答える 3

3

すべての要素が都市であることを「知っている」場合は、型消去を使用できます。(これにより、オフにできる警告が表示されます)

List<City> cityObjects = (List) baseCatalogObjects;

または、目的のタイプを検索に渡すことができます。検索では、それらが正しいタイプであることを確認することもできます。

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

実際、CatalogTypeが冗長であることに気付くかもしれません。

List<City> cityObjects = getBaseCatalogObjects(City.class);
于 2011-07-15T08:09:57.760 に答える
1

Peterが提案したように、メソッドのシグネチャを次のように変更できます。

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

そして、次のようにreturnステートメントでリストをキャストできます。

(List<T>) list;

お役に立てれば!

于 2011-07-15T08:22:04.010 に答える
0

次のようなことを試すことができます。

City[] cityArr = baseCatalogObjects.toArray(new City[0]);
List<City> cityObjects = Arrays.asList(cityArr);
于 2011-07-15T08:13:03.397 に答える