我尝试编写从网站中提取所有图像的程序(如壁纸)。我决定制作dinamic collection前图像链接,但getByXPath方法不允许我这样做:
HtmlPage currentPage = (HtmlPage) webClient.getPage(newURL("http://www.animewallpapers.com"));
List<?> urls = new ArrayList<HtmlImage>();
urls = currentPage.getByXPath("//img");
for(int i = 0; i < 500; i++){
currentPage = (HtmlPage) webClient.getPage(new URL(urls.get(i).toString()));
List<?> tempListUrls = new ArrayList<HtmlImage>();
tempListUrls = currentPage.getByXPath("//img");
这里我想将tempListUrls添加到网址,但我不能。您如何建议我解决这个问题?
答案 0 :(得分:2)
看起来你在这里处理的是混合泛型和非泛型codde:你的代码(显然使用泛型)和一些(可能是第三方)代码显然没有。作业
urls = currentPage.getByXPath("//img");
如果您将urls变量声明为List<HtmlImage>
,则无法编译,因为getByXPath
似乎正在返回未参数化的List
实例。问题是当你使用'?'参数化集合时然后编译器填写'?'到add方法(当然还有其他方法)。所以你得到boolean add(? o)
意味着方法现在接受的唯一对象,因为参数必须是不确定类型。不幸的是,只有null符合这个要求,因为只有null是不确定类型。
这意味着您必须自己使用未参数化的List
对象,或者必须在代码中从List
投射到List<HtmlImage>
,如下所示:
List<HtmlImage> urls = (List<HtmlImage>) currentPage.getByXPath("//img");
这将导致编译器警告,但只要您知道返回的列表将只包含HtmlImage
或其子类的实例,那么它是安全的。您可以在大多数Java编译器中使用@SuppressWarnings(“unchecked”)来避免警告。
作为旁注:您在代码中不必要地new ArrayList<HtmlImage> ()
分配给urls
和tempListUrls
,然后立即重新分配那些效率低下的变量。在这两种情况下,您都可以跳过创建未使用的ArrayList
。
所以你的代码看起来像这样:
HtmlPage currentPage = (HtmlPage) webClient.getPage(newURL("http://www.animewallpapers.com"));
@SuppressWarnings("unchecked")
List<HtmlImage> urls = (List<HtmlImage>) currentPage.getByXPath("//img");
for(int i = 0; i < 500; i++){
currentPage = (HtmlPage) webClient.getPage(new URL(urls.get(i).toString()));
@SuppressWarnings("unchecked")
List<HtmlImage> tempListUrls = (List<HtmlImage>) currentPage.getByXPath("//img");
我建议避免使用@SuppressWarnings,除非它只影响一行代码,否则将来会造成维护问题。