如何绑定泛型类



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

查看我的博客文章了解更多信息。

相关内容

  • 没有找到相关文章

最新更新