Типизация элементов в java.util.List - PullRequest
1 голос
/ 15 июля 2011

У меня есть два класса с именами "BaseCatalog" и "City". «BaseCatalog» является родительским классом «City», другими словами, «City» расширяет класс «BaseCatalog».

У меня есть метод с именем "getBaseCatalogObjects", который принимает один параметр catalogType и возвращает список объектов BaseCatalog. В соответствии с данным типом тип List может отличаться, но он всегда содержит объекты, расширяющие основной класс BaseCatalog.

Поскольку этот метод является универсальным, он всегда создает список, содержащий объекты BaseCatalog. Однако в этом случае я уверен, что каждый экземпляр BaseCatalog в списке также является объектом City:

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

Я хочу преобразовать этот список «baseCatalogObjects» в список с названием «cityObjects», который выглядит примерно так:

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

Возможно ли это или есть какой-нибудь эффективный способ сделать такое преобразование подобным образом, не создавая новый экземпляр java.util.List и итерируя по списку "baseCatalogobjects"?

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Если вы «знаете», что все элементы являются городами, вы можете использовать стирание типа. (Это дает вам предупреждение, которое вы можете отключить)

List<City> cityObjects = (List) baseCatalogObjects;

или вы можете передать требуемый тип в поиск, который также может проверить, что это правильный тип.

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

на самом деле вы можете обнаружить, что CatalogType является избыточным.

List<City> cityObjects = getBaseCatalogObjects(City.class);
1 голос
/ 15 июля 2011

Как предложил Питер, вы можете изменить сигнатуру вашего метода на что-то вроде следующего:

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

И затем вы можете привести свой список в оператор возврата, например,

(List<T>) list;

Надеждаэто помогает!

0 голосов
/ 15 июля 2011

Вы можете попробовать сделать что-то вроде этого:

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