Java未检查赋值
我定义了一个函数,它返回实现分页数据接口的所有对象的通用列表Java未检查赋值,java,list,generics,collections,Java,List,Generics,Collections,我定义了一个函数,它返回实现分页数据接口的所有对象的通用列表 private <T> List<T> paginate(int pageNumber, int pageSize, int totalAvailable, PaginatedResponse paginatedResponse, String url) { List<T> listOfObjects = new ArrayList(); while (pageNumber *
private <T> List<T> paginate(int pageNumber, int pageSize, int totalAvailable, PaginatedResponse paginatedResponse, String url) {
List<T> listOfObjects = new ArrayList();
while (pageNumber * pageSize <= totalAvailable) {
paginatedResponse = sendRequest(url + "?pageNumber=" + pageNumber, paginatedResponse.getClass());
listOfObjects.addAll(paginatedResponse
.getPaginationData()
.getPaginatedObjectsList());
pageNumber++;
}
return listOfObjects;
}
其中PaginationData是定义的接口
public interface PaginationData<T> {
List<T> getPaginatedObjectsList();
}
公共接口分页数据{
列出getPaginatedObjectsList();
}
sendRequest方法如下所示
public interface PaginatedResponse {
Pagination getPagination();
PaginationData getPaginationData();
}
private <T> T sendRequest(String url, Class<T> clazz) {
HttpResponse httpResponse = httpClient.send(url);
//Jackson's object mapper to transform the result
// but this result can be also other type than the PaginatedResponse
try {
return objectMapper.readValue(httpResponse.getEntity(), clazz);
} catch (IOException e) {
throw new ParsingException(e);
}
}
private T sendRequest(字符串url,类clazz){
HttpResponse HttpResponse=httpClient.send(url);
//Jackson的对象映射器来转换结果
//但是这个结果也可以是分页响应以外的其他类型
试一试{
返回objectMapper.readValue(httpResponse.getEntity(),clazz);
}捕获(IOE异常){
抛出新的ParsingException(e);
}
}
一切正常,我只是在调用listOfObjects变量上的.addAll()方法时收到一个警告。
此警告指出:未选中的赋值,java.util.List到java.util.Collection在
接口PaginatedResponse
中,PaginationData
为原始类型。您应该将其更正为:
public interface PaginatedResponse{//type参数在此处是必需的,或者至少在方法级别getPaginationData()是必需的
分页getPagination();
PaginationData getPaginationData();//这将删除原始类型用法
}
然后,更新paginate(…)
方法如下(参数PaginatedResponse PaginatedResponse
到PaginatedResponse PaginatedResponse
以删除原始类型用法):
private List paginate(int pageNumber、int pageSize、int totalAvailable、paginedresponse paginedresponse、字符串url){
// ...
}
此外,将列表初始化为list listOfObjects=new ArrayList()代码>而不是列表对象=新ArrayList()
删除原始类型用法
编辑有关sendRequest()
方法的后续问题:
对于sendRequest()
方法,请使用from jackson而不是Class
。有关更多详细信息,请查看主题“类型擦除”
定义如下所示的方法:
private T sendRequest(字符串url,类型引用类型引用){
//…您的原始代码。。。
返回objectMapper.readValue(httpResponse.getEntity(),typeReference);
//…您的原始代码。。。
}
可以这样称呼:
paginatedResponse=sendRequest(url+”?pageNumber=“+pageNumber,new TypeReference(){});
您在一些地方使用。首先要避免这种情况。谢谢@Viral.的评论。。不幸的是,它只将警告移动到paginatedResponse=sendRequest(url+“?pageNumber=“+pageNumber”);返回私有T sendRequest(url)@MarkyMark的方法,在您的问题中没有关于sendRequest()
方法的参考/详细信息。请相应地更新您的问题。我已更新问题以显示sendRequest方法。请check@MarkyMark,有关详细信息,请查看主题“类型擦除”。在您的情况下,应该使用jackson提供的TypeReference
,而不是sendRequest()
方法的类。如下定义:private T sendRequest(字符串url,类型引用类型引用)
,如下使用:objectMapper.readValue(httpResponse.getEntity(),类型引用)代码>并按如下方式传递:paginatedResponse=sendRequest(url+“?pageNumber=“+pageNumber,new TypeReference(){})代码>为了更好地理解,我已经用细节更新了这个答案。