Generics 带Guice的GenericDao

Generics 带Guice的GenericDao,generics,guice,typeliteral,Generics,Guice,Typeliteral,我有一个接口DAO,以及它的一般实现(GenericDAO实现DAO) 我想这样做: public interface UserDao extends Dao<User> { // code } // module bind(UserDao.class).to(GenericDao.class); 公共接口UserDao扩展了Dao{ //代码 } //模块 绑定(UserDao.class).to(GenericDao.class); 可能吗? 我设法自动地将Dao注入到G

我有一个接口
DAO
,以及它的一般实现(
GenericDAO实现DAO

我想这样做:

public interface UserDao extends Dao<User> {
 // code
}

// module
bind(UserDao.class).to(GenericDao.class);
公共接口UserDao扩展了Dao{
//代码
}
//模块
绑定(UserDao.class).to(GenericDao.class);
可能吗?
我设法自动地将Dao注入到GenericDao(我没有创建特定的userdao实现),但是,无法让它工作…

我认为您无法将
userdao
绑定到
GenericDao
。因为
GenericDao
没有实现
UserDao
,尽管两者都有一个共同的祖先。如果
GenericDao
类具有您需要的所有方法,那么您不需要单独的
UserDao
类。您只需要一个绑定,正如Jeff所写:

bind(new TypeLiteral<DAO<User>>(){}).to(new TypeLiteral<GenericDAO<User>>(){});
bind(new-TypeLiteral(){}).to(new-TypeLiteral(){});
然后,您的客户机类将依赖于
DAO
,它们将收到
GenericDAO
。如果确实需要一些
用户
特定于实体的操作,那么应该扩展
GenericDao


我写了一篇关于这个的帖子。具体来说,请参见本文底部。

为了实际使用泛型类,您必须最终为
T
选择一个类型。对于最终使用的每种类型,都需要创建如下绑定(使用
T
Integer
)作为示例:

bind(new TypeLiteral<DAO<Integer>>(){})
   .to(new TypeLiteral<GenericDAO<Integer>>(){});
bind(新的TypeLiteral(){})
.to(新的TypeLiteral(){});