내 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()
방법은 반환 일반 목록 (여기서 Play를 사용하기 때문에 List<T>
또는 List<GenericModel>
) 필자가 생각하기에이 list()
메서드를 사용하면 내 목록에 올바른 목록 인 List<Picture>
을 반환 할 수 있습니다. 이것이 가능한가 ?
참고 : 이제 Play에서 페이지 매김을위한 모듈이 있습니다! 프레임 워크, 내 질문은 주로 자바에 대한 자세한 내용을 이해하기위한 것입니다 :)
정말 고마워, 정말 고마워!
도움 주셔서 감사합니다. Picture 클래스에서 사용한 것을 본 것은 이해하지 못합니다 : JPA의 항목 만 사용합니다 (찾기 및 개수). 그러나 마지막으로 T를 사용하는 제네릭 클래스가 GenericModel을 확장 할 수 있도록 코드를 업그레이드했는데 문제가 있습니다. 클래스 typeToken = ...이 오류를 발생시킵니다. java.lang.Class를 java.lang.reflect로 형변환 할 수 없습니다. .ParameterizedType'. 내가 도대체 뭘 잘못하고있는 겁니까? –
Re : 그림 클래스, 클래스 메서드를 찾고 있었고 Play를 계산했습니다. 당신을 위해 제공합니다. Re : ClassCastException - 위에서 설명한 것처럼 PicturesPaginator를 만들지 않았다고 가정합니다. 매개 변수가있는 유형을 제공하는 일반 기본 클래스를 확장하는 하위 클래스를 사용합니다 ("PicturesPaginator extends GenericPaginator extends the Example of this"). 다른 방법은 Class typeToken 메서드 매개 변수를 GenericPaginator의 생성자에 추가하는 것입니다. –
당신은 올바르게 추측했습니다! :) 나는 PicturePaginator의 내용을 Page로 옮겨 모든 것을 하나의 클래스로 옮기려고했습니다. 마침내 내 모델에 직접 작업을 추가하고 JPAQuery (find()의 결과), Long (count()의 결과)과 같은 매개 변수를 사용하여 Page를 호출하기로 결정했습니다. 그것은 깔끔한 것은 아니지만 적어도 작동합니다. 당신의 도움을 주셔서 감사합니다 :) –