gpt4 book ai didi

java - 如何绑定(bind)泛型类?

转载 作者:行者123 更新时间:2023-12-02 00:26:47 26 4
gpt4 key购买 nike

当我尝试使用 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 上阅读了几篇关于此绑定(bind)泛型的文章,但我无法找到使用 TypeLiteral 进行绑定(bind)的方法。

这是我尝试过的:

bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(ConcreteDao.class);

最佳答案

您需要像这样绑定(bind):

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),如下所示:

bind(new TypeLiteral<GenericDao<User>>(){}).in(Scopes.SINGLETON);

查看我的blog-post了解更多信息。

关于java - 如何绑定(bind)泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9847793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com