如何使用HtmlUnit方法列出<! - ? - >?

时间:2014-02-15 22:15:14

标签: java list htmlunit

我尝试编写从网站中提取所有图像的程序(如壁纸)。我决定制作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添加到网址,但我不能。您如何建议我解决这个问题?

1 个答案:

答案 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> ()分配给urlstempListUrls,然后立即重新分配那些效率低下的变量。在这两种情况下,您都可以跳过创建未使用的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,除非它只影响一行代码,否则将来会造成维护问题。