2015-09-10 4 views
1

Если тип B может быть обобщена на тип A, как преобразовать List<B> к List<A>?Преобразовать ArrayList <String> в ArrayList <Object>

List<A> newList=new ArrayList<A>(); 
for(B t:oldList) newList.add(t); 

Edit:: Мне нужен цикл вроде делать не знаю, слово для него, но я хочу сказать, объект типа B может быть преобразован в объект типа A (как B implements A).

Edit2: Похоже, что конструктор также работает:

List<A> newList=new ArrayList<A>(oldList); 

Однако я хотел более эффективный подход, а не просто копирование списка.

+0

Вы имеете в виду 'как B расширяет A'? –

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ Мой случай использования был, когда B реализует A. – user1537366

ответ

3

Вы не должны с List<B> означать, что он будет содержать только элементы типа B или подтипы. List<A> позволит вам добавлять элементы типа A, что может быть опасно. Следовательно, вы не должны отливать List<B> в List<A>.

Если вы создаете новый List<A> и поместите в него все элементы List<B> (например, используя цикл, возможно, завернутый в метод), все в порядке.

Одним из простых способов заполнить новый список будет метод addAll(), например.

List<A> aList = ...; 
List<B> bList = ...; 

aList.addAll(bList); 
2

Как указано в комментарии, если Class B implements Class A, приведенный ниже код совершенно зажженным.

newList.addAll(listofBs); 

Поскольку каждый B является A, вы имеете право сделать это.

И да, вам не нужно иметь петлю.

1

Дженерики не позволяют непосредственно создавать объекты коллекции.

Вы можете сделать несколько вещей:

List<B> oldList = new List<B>(); 
List<? super B> upcastedList = oldList; // No new object created. 

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

0

Если вы хорошо с lišta быть неизменяемым, вот еще один возможный ответ (используя подсказку ANKUR в):

List<B> listB=new ArrayList<B>(); 
List<A> listA=Collections.unmodifiableList((List<? extends A>)listB); 
0

Это может быть добавлен во время создания, а также как

List<A> newList = new ArrayList<A>(oldList); 
Смежные вопросы