Как получить экземпляр класса, используя отражение в java с параметром generics и методом возвращаемого типа? - PullRequest
0 голосов
/ 26 мая 2020
public enum E{
E1,E2,E3
}

public class Service{
...
}

public interface A<RET>{
  RET get();
}

public interface AI<RET,CONF> extends A<RET>{
   void conf(CONF ...args);
}

public class AC implements AI<Service,E>{
  public void conf(E ...args){
   ....
 }
public Service get(){
  return new Service();
}
}

Теперь, когда я пытаюсь с отражением создать экземпляр класса «A C», я получаю сообщение об ошибке:

public Class MyReflectionAPI{
  public Object getInstance(){
       Class <? extends AI> aClass = (Class <? extends AI>) Class.forName("AC");
       Constructor<? extends AI> aCon = aClass.getConstructor(null);
       AI ai = aCon.newInstance((Object[]) null);

        Class<?> typeArg = Class.forName("[L"+"E"+";");
        Method valueOfTypeArg = typeArg.getMethod("valueOf", String.class);
        Object obj[] = new Object[]{valueOfTypeArg.invoke(typeArg,"E1")};
        ai.conf(obj);
    }

}

, что дает мне ошибку: Exception in thread «main» java .lang.ClassCastException: [L java .lang.Object; не может быть преобразовано в [E;

Есть ли способ получить объект класса Экземпляр A C с переданными ему объектами generi c?

1 Ответ

1 голос
/ 26 мая 2020

Java массивы знают свой компонентный тип. Таким образом, вам нужно будет создать массив рефлексивно. Попробуйте следующее.

Class<?> typeE = Class.forName("E");
Object obj = Array.newInstance(typeE,1);
Array.set(obj,0,valueOfTypeArg.invoke(typeE,"E1"));
ai.conf((Object[])obj);    // good reason to hate varargs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...