如何绑定Generic类?

时间:2012-03-23 23:36:26

标签: java generics mockito guice jukito

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

1 个答案:

答案 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