当我尝试使用Jukito模拟Dao时,我得到以下异常:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at org.jukito.JukitoModule.addKeyDependency(JukitoModule.java:338)
at org.jukito.JukitoModule.addInjectionPointDependencies(JukitoModule.java:330)
at org.jukito.JukitoModule.addDependencies(JukitoModule.java:313)
我尝试模拟的对象是ConcreteDao
。
public class ConcreteDao extends AbstractDao<MyDomain> {
}
public abstract class AbstractDao<T extends DatastoreObject> {
}
我在SO上阅读了几篇有关此绑定泛型的帖子,但我无法找到一种方法来使用TypeLiteral
进行绑定。
这就是我的尝试:
bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(ConcreteDao.class);
答案 0 :(得分:3)
你需要像这样绑定:
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
传递给父类(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);
有关详细信息,请参阅我的blog-post。