当我试图用Jukito模拟一把刀时,我得到了以下异常:
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);
您需要像这样绑定:
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);
查看我的博客文章了解更多信息。