Я использую рефлексию для создания экземпляров классов для конкретной потребности.
Текущий код похож на:
public final <T> T instanciate(Class<? extends T> a_clazz, Object... args) {
// Other stuff when no arg...
Class<?>[] l_argsClasses = getClassesFromObjects(args);
Constructor<?> constructor = a_clazz.getConstructor(l_argsClasses);
constructor.newInstance(args)
}
К сожалению, я прочитал, что это не будет работать, если заданные параметры не совсем одного типа в объявлении конструктора.
Поэтому, когда я даю подкласс, конструктор не найден, и я получаю исключение NoSuchMethodException.
Похоже, что здесь нет механизма для обработки полиморфизма.
Пример:
public class A {
}
public class B extends A {
}
public class Foo extends A {
public Foo(A a) {
}
}
Будет работать:
instanciate(Foo.class, new A()); // because Foo(A a)
Не будет работать:
instanciate(Foo.class, new B()); // because Foo(B b) does't exists
Есть ли у вас какое-либо решение для решения этой проблемы?
Спасибо