Определение массива объектов неизвестного типа и присвоение правильного типа объектам в конструкторе

#java #generics #vector #arraylist

#java #общие сведения #вектор #arraylist

Вопрос:

Я пытаюсь добиться универсального поведения класса foo_unknown, который вызывает методы foo_func1(), foo_func2(); и это зависит от типа объектов, определенных в конструкторе класса foo, которые вызываются реализациями методов foo_func1() и foo_func2(). Также приветствуется любой новый революционный шаблон проектирования. Который решает все проблемы.

Комментарии:

1. Вам действительно нужно уточнить, что вы пытаетесь сделать. В чем именно проблема, с которой вы столкнулись в своем коде? Вы понимаете, что делает интерфейс в Java? Также кажется, что это может быть проблемой.

2. Есть ли причина, по которой вы не хотите определять абстрактные foo_func1 и foo_func2 в базовом классе?

3. Спасибо за ответ, Брайан. Я знаю об интерфейсах. Я реализую генетический алгоритм. Классы foo1 и foo2, скажем, относятся к разным областям задач. foo_controller — это класс генетического алгоритма, который вызывает различные функции в классах foo1 (crossover, fitness) и foo2. Итак, вы предлагаете определить интерфейс foo и назначить этот foo как поле в foo_controller, в то время как foo1 и foo2 реализуют этот интерфейс. Хорошее предложение, я попробую это.

4. Из того, что вы описываете здесь, звучит так, как будто вы хотите реализовать шаблон стратегии .

5. Кстати, обычным соглашением является использование имен с заглавной буквы для классов и строчных букв только для методов и (нестатических-конечных) переменных. (И если вы хотите ответить конкретному человеку, включите ‘@ name’, например ‘@pulkittomar’, в ответный комментарий. Затем они автоматически уведомляются.)

Ответ №1:

Если вы не прочь сделать это рефлексивно, попробуйте что-то вроде этого:

 public FooController(Class<? extends Foo> clazz, int number) {
     this.fooUnknown = Array.newInstance(clazz, number);
     for (int i = 0; i < number; i  ) {
         Array.set(this.fooUnknown, i, clazz.newInstance());
     }
}
  

(Предупреждение: не скомпилировано, не протестировано, требуется обработка исключений и т.д.)

Комментарии:

1. Спасибо, сейчас я внедряю этот подход. Я попробую это.

2. почему бы просто this.fooUnknown[i] = clazz.newInstance();