Java-модуль с помощью обобщений и рефлексии - PullRequest
0 голосов
/ 29 августа 2018

Я хочу создать свой собственный простой модуль di, для чего я создал:

public interface Factory<T> {
T getInstance();
}

и

public class DiImpl implments Di{

private Map<Class, Factory> map = new HashMap<>();

@Override
public <T> Factory<T> getFactory(Class<T> type) {
    return (Factory<T>) map.get(type);
}

@Override
public <T> void bind(Class<T> base, Class<? extends T> impl) {
    map.put(base, new Factory<Class<?>>() {
        @Override
        public Class getInstance() {
            return  new Class<?>.newInstance; //here should be new instance of impl class
        }
    });
}
}

Но этот код не проходит простой тест:

interface SimpleService {
....
}

FirstVaraintService implements SimpleService {
...
}

@Test
void test(){
  Di di= new DiImpl();
  di.bind(SimpleService.class, FirstVaraintService.class);       
  Factory<SimpleService> factory = di.getFactory(SimpleService.class);
  assertSame(FirstVaraintService.class, factory.getInstance().getClass());
}

возвращает компилятор:

java.lang.ClassCastException: java.lang.Class cannot be cast to ... SimpleService

Я знаю, что такая структура di может быть реализована с помощью API отражения, но я не знаю, как правильно использовать ее в этом примере. Как я могу изменить свой код для прохождения теста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...