1

当我尝试使用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);
4

1 回答 1

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的 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);

有关更多信息,请参阅我的博客文章

于 2012-07-26T10:12:59.877 回答