Guice и универсальный завод - PullRequest
0 голосов
/ 27 октября 2019

Я новичок в guice, и, используя guice 4.1, я хочу создать следующий класс:

public class GuiceMain<T> implements IGuiceMain<T> {

    private ObjectWrapperFactory<T> factory;

    @Inject
    public GuiceMain(ObjectWrapperFactory<T> factory) {
        this.factory = factory;
    }

    public void process(T t) {
        ObjectWrapper wrapper = factory.create(t);
    }
}

У меня нет строгих требований к его созданию, но я пришел к решению создать интерфейсGuiceMainFactory

public interface GuiceMainFactory {
    <T> GuiceMain<T> create();
}

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

Injector injector = Guice.createInjector(new Configuration());
GuiceMain<File> instance = injector.getInstance(GuiceMainFactory.class).create();
File f = new File("text.txt");

instance.process(f);

, и в моем классе конфигурации guice я пишу

install(new FactoryModuleBuilder().implement(IGuiceMain.class, GuiceMain.class).build(GuiceMainFactory.class))

Но я получаю ошибку: 1) com.guice.GuiceMainFactory нельзя использовать в качестве ключа;Он не указан полностью. Поэтому я решил написать реализацию GuiceMainFactory

public class GuiceMainFactoryImpl implements GuiceMainFactory {

    private ObjectWrapperFactory objectWrapperFactory;

    @Inject
    public GuiceMainFactoryImpl(ObjectWrapperFactory objectWrapperFactory) {
        this.objectWrapperFactory = objectWrapperFactory;
    }

    @Override 
    public <T> GuiceMain<T> create() {
        return new GuiceMain<T>(objectWrapperFactory);
    }
}

, но в этом случае в строке вернуть новый GuiceMain (objectWrapperFactory); Я получаю непроверенное назначение предупреждение, потому что я не могу указать универсальный тип objectWrapperFactory

Я думаю, что я все усложнил, но я не знаю, как с этим справиться

...