我有课:
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);
}
}
如何编写这样的泛型服务?
最佳答案
是的,您需要创建一个单独的构造函数。
您当前的构造函数假定this
是GenericDAO
子类的实例,并且它使用该事实通过getClass().getGenericSuperclass().getActualTypeArguments()
为您获取类型参数。
要直接使用GenericDAO
,您应该创建一个GenericDAO
构造函数,该构造函数将实体类(实际上是T
类型)作为参数。然后在CRUDBean.size()
或需要实例化GenericDAO
的任何地方提供实体类。
如果CRUDBean
中没有可用的实际类,请选择三个:
创建一个以实体类为参数的CRUDBean
构造函数。
向size()
添加一个参数,该参数将实体类作为参数。
使用与当前GenericDAO
构造函数相同的技巧来获取它,但改为使用getGenericInterfaces()
。
关于java - 泛型有可能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7384601/