2013-10-07 4 views
1

У меня есть два ArrayLists, которые содержат Parent и Child класс, который Child экстентов Parent и Second расширяет конструктор FirstПреобразовать ArrayList <subclass> в ArrayList <parent>

public First(ArrayList<Parent> parents) 
{ 
    // Parent Class's constructor 
} 

второго класса,

public Second(ArrayList<Child> child) 
{ 
    super(child); 
    // child class's constructor take ArrayList<Child> 
} 

Можно ли бросить ArrayList<Child> до ArrayList<Parent>?

+0

Вам нужно будет перебрать все значения списка и бросить его. –

+2

Как насчет 'ArrayList '? – Churro

+0

Или вы можете объявить свой параметр метода как 'ArrayList , возможно? Не совсем понятно, что вы хотите сделать. Вы хотите передать ArrayList ребенка на первое место? –

ответ

3

Кредит идет на Churro.

@SuppressWarnings("unchecked") 
public Second(ArrayList<? extends Parent> child) 
{ 
    super((ArrayList<Parent>) child); 
} 
+0

Как это решить вашу проблему? По-видимому, из-за того, что вам действительно нужен тип элемента вашего списка, чтобы быть «Child», и вы теряете это здесь. –

0

this.addAll(child) в конструкторе second.

Его не кастинг, но это создаст новый Arraylist с содержанием child

5

Это способ бросить от родителя к ребенку

public static void main(String[] args) { 
    ArrayList<Foo> parentArray = new ArrayList<Foo>(); 
    parentArray.add(new Foo("tooLazy")); 
    parentArray.add(new Foo("tooAdd")); 
    parentArray.add(new Foo("tooMoreFields")); 
    ArrayList<Boo> childArray = (ArrayList<Boo>) ((ArrayList<?>) parentArray); 
} 

И это путь к отлит из ребенка к родителю

//Boo extends Foo BTW 
public static void main(String[] args) { 
    ArrayList<Boo> parentArray = new ArrayList<Boo>(); 
    parentArray.add(new Boo("tooLazy")); 
    parentArray.add(new Boo("tooAdd")); 
    parentArray.add(new Boo("tooMoreFields")); 
    ArrayList<Foo> childArray = (ArrayList<Foo>) ((ArrayList<?>) parentArray); 
} 
+0

Будет предупрежденное предупреждение. – siutsin

+0

Да, но какое большое дело, если вы уже знаете, что эти классы являются родительскими и дочерними ?. Конечно, есть лучшие способы, как 'ArrayList '. – 4gus71n

+0

Ya вы правы, оба 'ArrayList 'и' (ArrayList ) ((ArrayList ) parentArray) 'хороши. Спасибо – siutsin

0

Единственный способ это соотношение кошерным есть если в конструкторе Parent вы никоим образом не изменяете список ввода, за исключением, возможно, его очистки или добавления в него нулей. В этом случае вы также можете сделать тип аргумента конструктора First равным ArrayList<? extends Parent>. Тогда нет необходимости копировать массив или делать небезопасные роли.

Я должен добавить, что, если вы не полагаетесь на конкретные свойства класса ArrayList, List<? extends Parent> будет еще лучше.

+0

Но это жертва проверки типа в Первом? – siutsin

+0

Как так? Сначала будет приниматься только список, чьими элементами являются все классы Parent или более специфичные, чем Parent. Это позволяет также перечислить список Child. Согласно вашему вопросу, это ваше намерение. –

Смежные вопросы