Java泛型<;?扩展类>;和类<;P>;问题
我有以下和平的准则:Java泛型<;?扩展类>;和类<;P>;问题,java,generics,inheritance,Java,Generics,Inheritance,我有以下和平的准则: public class LazyProductDataModel<P extends Product> extends LazyDataModel<P> { private List<P> data = new ArrayList<P>(); private SearchProductsCriteria<P> criteria; public LazyProductDataModel(
public class LazyProductDataModel<P extends Product> extends LazyDataModel<P> {
private List<P> data = new ArrayList<P>();
private SearchProductsCriteria<P> criteria;
public LazyProductDataModel(SearchProductsCriteria<P> criteria) {
this.criteria = criteria;
}
public SearchProductsCriteria<P> getCriteria() {
return criteria;
}
public void setCriteria(SearchProductsCriteria<P> criteria) {
this.criteria = criteria;
}
@Override
public List<P> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
if (criteria == null) {
return data;
}
int currentPage = first==0 ? 1 : first >= pageSize ? (first / pageSize) + 1 : 0;
criteria.setPageNumber(currentPage);
criteria.setPageSize(pageSize);
try {
if (criteria.getProductId() != null && criteria.getProductId() != 0) {
P product = ServiceClientFactory.getInstance().
getProductRetrieveClient(criteria.getProductClass()).getProduct(criteria.getProductId());
if (product != null) {
data.add(product);
this.setRowCount(1);
}
} else {
LazyDataResponse<P> lazyResponse = ServiceClientFactory.getInstance().
getProductSearchClient(criteria.getProductClass()).searchProductsLazyResponse(criteria);
data = lazyResponse.getList();
this.setRowCount(lazyResponse.getTotalRecordsCount());
}
} catch (Exception e) {
LOGGER.error("Exception happened at LazyProductDataModel#load.", e);
data = new ArrayList<P>();
this.setRowCount(0);
}
return data;
}
}
最后,
public class ProductReportCriteria<P extends Product> extends SearchProductsCriteria<P> implements Serializable {
}
public class SearchProductsCriteria<P> implements Serializable {
private Class<P> productClass;
public Class<P> getProductClass() {
return productClass;
}
public void setProductClass(Class<P> productClass) {
this.productClass = productClass;
}
}
公共类ProductReportCriteria扩展SearchProductsCriteria
实现可序列化{
}
公共类SearchProductsCriteria
实现可序列化{
私人类
productClass;
公共类
getProductClass(){
返回productClass;
}
公共无效setProductClass(类
productClass){
this.productClass=productClass;
}
}
ProductReportCriteriaProductReportCriteria我仍然得到一个编译错误,我尝试了三种方法,仍然得到相同的编译错误不清楚为什么您认为,ProductReportCriteria
与ProductReportCriteria
相同。
仍然表示“扩展了产品的特定事物,编译器只是不知道是什么”。事实上,就大多数实际用途而言,ProductReportCriteria
只是ProductReportCriteria的简写。我仍然会遇到编译错误,我尝试了三种方法,仍然会遇到相同的编译错误。不清楚您为什么会这样想,ProductReportCriteria
与ProductReportCriteria
相同。
仍然表示“扩展了产品的特定事物,编译器只是不知道是什么”。事实上,在大多数实际应用中,ProductReportCriteria
只是ProductReportCriteria的缩写
public class Movie extends Product implements Serializable {
}
public class Product implements Serializable {
}
public class ProductReportCriteria<P extends Product> extends SearchProductsCriteria<P> implements Serializable {
}
public class SearchProductsCriteria<P> implements Serializable {
private Class<P> productClass;
public Class<P> getProductClass() {
return productClass;
}
public void setProductClass(Class<P> productClass) {
this.productClass = productClass;
}
}
List<Double> doubles = new ArrayList<>();
List<? extends Number> numbers = doubles; // Fine.
numbers.add(Integer.valueOf(0)); // Doesn't work; pretend it does.
Double d = doubles.get(0); // ClassCastException!
ProductReportCriteria<? super Product>
ProductReportCriteria<Product>
ProductReportCriteria<?> // Same as Product, because of declared bounds