#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);
Но в моем проекте уже происходит взрыв интерфейса.
Есть ли способ получше?