我有课:

public class GenericDAO<T, ID extends Serializable> {
private final EntityManager em;
private final Class<T> entityClass;
public GenericDAO(EntityManager em) {
    this.em = em;
    ParameterizedType genericSuperClass = (ParameterizedType) getClass().getGenericSuperclass();
    this.entityClass = (Class<T>) genericSuperClass.getActualTypeArguments()[0];
}
}


如果我扩展此课程,一切正常。现在,我想直接使用此类(请参见代码belove,CRUDBean是CRUDService的实现)-有必要重写构造函数以获取特定的类。

@Remote(CRUDService.class)
@Stateless
public class CRUDBean<T extends EntityBase> implements CRUDService<T> {
@PersistenceContext
private EntityManager entityManager;

@Override
public long size(String whereClause, Map<String, Object> whereParameters) {
    return new GenericDAO<T, Long>(entityManager).size(whereClause, whereParameters);
}
}


如何编写这样的泛型服务?

最佳答案

是的,您需要创建一个单独的构造函数。

您当前的构造函数假定thisGenericDAO子类的实例,并且它使用该事实通过getClass().getGenericSuperclass().getActualTypeArguments()为您获取类型参数。

要直接使用GenericDAO,您应该创建一个GenericDAO构造函数,该构造函数将实体类(实际上是T类型)作为参数。然后在CRUDBean.size()或需要实例化GenericDAO的任何地方提供实体类。

如果CRUDBean中没有可用的实际类,请选择三个:


创建一个以实体类为参数的CRUDBean构造函数。
size()添加一个参数,该参数将实体类作为参数。
使用与当前GenericDAO构造函数相同的技巧来获取它,但改为使用getGenericInterfaces()

关于java - 泛型有可能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7384601/

10-10 16:53