List<?>範型,範型通配符的使用<?>,`?`是類型實參,而不是類型形參,此處的`?`和Number、String、Integer一樣都是一種實際的類型,可以把`?`看成所有類型的父類。是一種真實的類型。可以解決當具體類型不確定的時候,使用通配符`?`。List<?>一般作爲參數來接收外部集合,或者返回一個具體元素類型的集合。
一個應用例子:
public void test2() {
List<?> resultList;
List<ImgSearchDTO> imgSearchDTOList =(List<ImgSearchDTO>) getList("DTO");
List<ImgSearchParam> imgSearchParamList = (List<ImgSearchParam>) getList("param");
//示例1:
//範型通配符模擬-接收參數1
resultList = imgSearchDTOList;
for (Object item : resultList) {
ImgSearchDTO itemDTO = (ImgSearchDTO) item;
System.out.println(itemDTO.getRootCategory());
}
//範型通配符-模擬返回參數,並強制轉換爲目標類型
List<ImgSearchDTO> dtoList = (List<ImgSearchDTO>) resultList;
for (ImgSearchDTO item : dtoList) {
System.out.println(item.getRootCategory());
}
//示例2:
resultList = imgSearchParamList;
for (Object item : resultList) {
ImgSearchParam itemParam = (ImgSearchParam) item;
System.out.println(itemParam.getCategory());
}
List<ImgSearchParam> paramList = (List<ImgSearchParam>) resultList;
for (ImgSearchParam item : paramList) {
System.out.println(item.getCategory());
}
}
public static List<?> getList(String type) {
List<ImgSearchDTO> imgSearchDTOList = new ArrayList<>();
List<ImgSearchParam> imgSearchParamList = new ArrayList<>();
ImgSearchDTO imgSearchDTO1 = new ImgSearchDTO();
ImgSearchDTO imgSearchDTO2 = new ImgSearchDTO();
imgSearchDTO1.setRootCategory("DTO_test1");
imgSearchDTO2.setRootCategory("DTO_test2");
imgSearchDTOList.add(imgSearchDTO1);
imgSearchDTOList.add(imgSearchDTO2);
ImgSearchParam imgSearchParam1 = new ImgSearchParam();
ImgSearchParam imgSearchParam2 = new ImgSearchParam();
imgSearchParam1.setCategory("param_test1");
imgSearchParam2.setCategory("param_test2");
imgSearchParamList.add(imgSearchParam1);
imgSearchParamList.add(imgSearchParam2);
if (type.equals("DTO")) {
return imgSearchDTOList;
} else {
return imgSearchParamList;
}
}