仿制药有可能吗?

时间:2011-09-12 07:31:16

标签: java generics

我上课了:

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);
}
}

如何编写此类仿制服务?

3 个答案:

答案 0 :(得分:1)

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

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

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

如果您在CRUDBean中没有可用的实际班级,则有三种选择:

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

答案 1 :(得分:0)

我建议使用显式的“类型令牌”,而不是重用一个类。

答案 2 :(得分:0)

通常的,最简单的方法是将类的实例传递给构造函数:

public GenericDAO(EntityManager em, Class<T> entityClass) {
    this.em = em;
    this.entityClass = entityClass;
}

然后这样称呼:

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