我正在一个分页系统对我的Java项目,我想使它通用对我的各种JPA模型。泛型类和方法
的问题(据我所知)是,如果我使用泛型,我会以某种方式转换返回的最终值进行这项工作。我怎样才能避免这种情况?
这里是我到目前为止的代码(绝对不是一般的!):
public interface Paginator {
public void setLimit(Integer limit);
public Page page(Integer page);
}
public class PicturesPaginator implements Paginator {
private Integer limit = 10;
private JPAQuery query;
private Long quantity;
public PicturesPaginator(String query, Object... params) {
this.query = Picture.find(query, params);
this.quantity = Picture.count(query, params);
}
@Override
public void setLimit(Integer limit) {
this.limit = limit;
}
@Override
public PicturesPage page(Integer page) {
if (page == null)
page = 1;
List<Picture> pictures = query.fetch(page, limit);
return new PicturesPage(pictures, quantity, page, limit);
}
}
public abstract class Page {
protected List<Picture> pictures;
protected Long quantity;
protected Integer page;
protected Integer limit;
public List<Picture> list() {
return pictures;
}
public Long count() {
return quantity;
}
public boolean hasNext() {
return (page * limit > quantity);
}
public boolean hasPrevious() {
return (page != 1);
}
public boolean hasOtherPages() {
return (hasNext() || hasPrevious());
}
public Integer nextPageNumber() {
if (!hasNext())
return null;
return (page + 1);
}
public Integer previousPageNumber() {
if (!hasPrevious())
return null;
return (page - 1);
}
public Integer currentPageNumber() {
return page;
}
}
public class PicturesPage extends Page {
public PicturesPage(List<Picture> pictures, Long quantity, Integer page, Integer limit) {
this.pictures = pictures;
this.quantity = quantity;
this.page = page;
this.limit = limit;
}
}
我想摆脱那些PicturesPaginator
和PicturesPage
并使它通用的,但是从抽象类页的list()
方法将返回一个通用列表(List<T>
或List<GenericModel>
,因为我在这里使用Play)。 我期望的是这个list()
方法返回正确的列表,也就是List<Picture>
在我的情况。这可能吗 ?
注:我现在有一个模块分页中播放!框架,我的问题主要是为了解更多关于Java太:)
非常感谢您的帮助,我真的很感激!
谢谢你的帮助。我不明白你从Picture类中看到了什么:我只使用来自JPA(find&count)的项目。但最后,我升级我的代码,以允许泛型类使用T扩展GenericModel,我有一个问题:'类 typeToken = ...'抛出此错误:'不能将java.lang.Class转换为java.lang.reflect .ParameterizedType'。我究竟做错了什么? –
Re:图片类,我是指类的方法找到并计算哪个Play!为您提供。 Re:ClassCastException - 我假设你没有像上面描述的那样创建PicturesPaginator,并且扩展了泛型基类的子类,提供了一个参数化类型(“类PicturesPaginator扩展GenericPaginator
你假设正确! :)我试图将所有内容都移动到一个Class中,将PicturesPaginator的内容移动到Page中。我最终决定将工作直接添加到我的模型中,并使用这些参数调用Page:JPAQuery(find()的结果),Long(count()的结果)。它并不整齐,但至少可以工作。谢谢你的帮助 :) –