Вам нужно привязать так:
bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(new TypeLiteral<ConcreteDao<MyDomain>>(){});
Вот как вы можете получить общий класс:
class AbstractDao {
protected final Class<T> clazz;
@Inject
public AbstractDao(TypeLiteral<T> type) {
clazz = (Class<T>) type.getRawType();
}
}
Подклассы AbstractDao
должны будут передавать специфичные для сущности TypeLiteral
s в родительский класс (AbstractDao
):
class ConcreteDao extends AbstractDao<MyDomain> {
@Inject
public ConcreteDao(TypeLiteral<MyDomain> type) {
super(type);
}
}
Обратите внимание, что вы можете сделать свой класс AbstractDao неабстрактным и реализовать базовые операции CRUD, чтобы вы могли использовать его без необходимости расширять AbstractDao
для каждой сущности. Вам просто понадобится привязка для каждой сущности, например:
bind(new TypeLiteral<GenericDao<User>>(){}).in(Scopes.SINGLETON);
См. Мой блог для получения дополнительной информации.