Как мне настроить Google-Guice с использованием универсального интерфейса?

#java #guice

#java #guice

Вопрос:

У меня есть куча фабрик типов сущностей, которые являются производными от общего универсального интерфейса. Например,

 public class ConnectionFactory implements IEntityFactory<Connection> { ... }
  

Я хотел бы использовать Google-Guice, чтобы разорвать жесткие зависимости от этих фабрик.

Однако при попытке настроить Guice возникает синтаксическая ошибка:

 public class EntityFactoryModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(IEntityFactory<Connection>.class).to(ConnectionFactory.class);
    }
}
  

Eclipse сообщает «IEntityFactory не может быть преобразован в переменную».

Может кто-нибудь, пожалуйста, помочь мне понять, почему это не работает? Кроме того, существует ли альтернативный синтаксис, который будет работать?

Ответ №1:

Мой Guice-fu обычно ограничен, но я думаю, вам нужен литерал типа здесь:

 bind(new TypeLiteral<IEntityFactory<Connection>>() {})
    .to(ConnectionFactory.class);
  

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

1. Здорово, Гайс-фу! К сожалению, это приводит к ошибке «Синтаксическая ошибка в токене (ах), неуместная конструкция (ы)».

2. @retrodrone: Я пропустил круглые скобки при вызове конструктора. Попробуйте отредактированную версию и посмотрите google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject /… для получения более подробной информации.

3. Мне следовало догадаться не сбрасывать со счетов тебя, @JonSkeet, с таким количеством значков. Кажется, это работает, большое спасибо за ссылку!

4. @retrodrone: Я считаю, что в этом случае вы должны использовать getProvider(Key.get(typeLiteral)).get() .

5. @retrodrone, @Jon: Вы также можете сделать getProvider(new Key<IEntityFactory<Connection>>(){}) .

Ответ №2:

Один из методов заключается в объявлении нового интерфейса:

 interface IConnectionFactory extends IEntityFactory<Connection> { ...}
  

Тогда я могу сделать:

 bind(IConnectionFactory.class).to(ConnectionFactory.class);
  

Но в моем проекте уже происходит взрыв интерфейса.
Есть ли способ получше?