编译源代码后,将通过以下行创建(匿名)类:
new GenericEntity<List<T>>(list) {}
使用类型变量来引用其父级。由于类型变量在运行时没有值,因此不能使用此类泛型。您被迫从呼叫站点传递所谓的 类型令牌
。这是一个示例,要求从的调用者传递令牌
findAll(),但是您可以在构造函数中要求一个令牌,并将其保存在实例变量中:
public abstract class GenericDataResource<T extends GenericModel> { public Response findAll(GenericEntity<List<T>> token) { Query query = em.createNamedQuery(modelClass.getSimpleName() + ".findAll"); List<T> list = query.getResultList(); return Response.ok(token).build(); }}
呼叫者将发送令牌,例如
new GenericEntity<List<User>>() {}
如果仅使用非参数化的子类,
findAll()则可以利用反射来构建令牌(未经测试,希望您有所了解):
@GET@Produces(MediaType.APPLICATION_JSON)public Response findAll() { Query query = em.createNamedQuery(modelClass.getSimpleName()+".findAll"); List<T> list = query.getResultList(); return Response.ok(new GenericEntity(list, getType())).build();}
您必须实现
getType()返回所需的类型。这将是一个
ParameterizedType能够表示类型的子类
List<DAO<User>>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)