2014-02-15 23 views
1

我試圖編寫從網站(如壁紙)提取所有圖像的程序。我決定DINAMIC收集脫穎而出圖像鏈接,但getByXPath法犯規讓我做這件事:如何使用List <?>與HtmlUnit方法?

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添加到URL,但我不能。你如何建議我解決這個問題?

+2

你不能添加任何東西到'列表'(除'null')。用實際的類型定義列表(我想是''HtmlImage')。 – qqilihq

+0

謝謝!似乎它解決了我的問題,然後要求添加投射和正確工作的方法 –

回答

2

它看起來像你在這裏處理的是一個混合的泛型和非泛型編碼:有你的代碼(顯然使用泛型)和一些(可能是第三方)代碼,顯然沒有。分配

urls = currentPage.getByXPath("//img"); 

失敗,如果你聲明爲List<HtmlImage>變量的URL,因爲它看起來getByXPath是返回一個unparameterized List實例進行編譯。問題是,當你用'?'參數化集合時然後編譯器填入'?'添加方法(當然還有其他方法)。所以你得到boolean add(? o)這意味着該方法現在接受的唯一對象必須是不確定類型的參數。不幸的是,只有null符合這個要求,因爲只有null是不確定類型的。

這意味着你必須使用一個unparameterized List對象自己,或者你必須從List轉換爲List<HtmlImage>在你的代碼是這樣的:

​​

這將導致一個編譯器警告,但只要你知道返回的列表將只包含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,否則它可以創建在未來維護頭痛。

相關問題