2014-01-15 3 views
-1

У меня есть ArrayList, который содержит объекты возможно разных классов и требует вызова конструкторов классов.Java: вызов конструктора класса

ArrayList list = new ArrayList(); 

list.add(new Child1()); 
list.add(new Child2()); 

public void Spawn(){ 

Class clazz = list.get(0).getClass(); 

list.add(clazz.getConstructor().newInstance()); 
} 

Как я могу это достичь? Последняя строка в коде возвращает ошибку, потому что clazz.getConstructor().newInstance() возвращает объект, а не экземпляр child1. В разных элементах списка будет общий родительский элемент, и на самом деле элементы в списке могут быть одинаковыми, но я просто не могу жестко закодировать имя класса в программе.

Редактировать: Возможно, я удалил пример слишком далеко.

У меня в основном есть класс, который манипулирует ArrayLists и должен добавлять новые экземпляры объектов, которые уже существуют внутри, но список может иметь разные типы классов внутри него.

Редактировать: Основываясь на любых ответах, это, очевидно, неправильный подход к решению проблемы! Я думаю, что попробую метод клонирования для объектов внутри освещенного, но я также буду искать другой подход. Спасибо за помощь.

+2

Почему, ну почему вы бы использовать сырые ArrayList в первую очередь? – Zavior

+1

Передать возвращенный объект соответствующему типу. – keshlam

+1

Это звучит как [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) (см. Ссылку). Можете ли вы рассказать о том, почему вы даже думаете, что вам нужно это сделать? У меня есть сильное подозрение, что существует гораздо лучший подход к решению общей проблемы (а не к конкретному кодовому вопросу). –

ответ

1

Это работает просто отлично:

public static void arraylist() throws Exception { 
    ArrayList list = new ArrayList(); 

    list.add(new X()); 

    Class clazz = list.get(0).getClass(); 

    list.add(clazz.getConstructors()[0].newInstance()); 

} 

И я не говорю, что вы должны использовать его ..

+0

Да, с тех пор, как трудно найти ответ на этот вопрос, мой подход может быть неправильным. У меня в основном есть класс, который манипулирует ArrayLists и нуждается в добавлении новых экземпляров объектов уже внутри, но в списке могут быть разные типы классов внутри него. – BreadnButter

+0

Он также работает в этом случае (если вы также используете 'list.add (новый Y()) и т. Д.). Но вы должны позаботиться о том, чтобы вызвать правильный конструктор с правильными аргументами. –

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