2015-04-07 126 views
2

我正在編寫一個URL驗證器。代碼如下所示java.lang.ClassCastException:java.net.URI不能轉換爲java.net.URL

public ValidationResult validate(final Object data, final Object root, final String path, final ValidationContext validationContext, final EvaluationContext evaluationContext) { 

    ValidationResult validationResult = new ValidationResult(); 

    @SuppressWarnings("unchecked") 
    List<URL> URLs = (List<URL>)data; 

    UrlValidator urlValidator = new UrlValidator(); 
    boolean isValid = true; 
    for (URL websiteURL : URLs) { 

     if (urlValidator.isValid(websiteURL.getPath())) { 
      isValid = true; 
     } else { 
      isValid = false; 
      break; 
     } 
     System.out.println("websiteURL.getPath() " + websiteURL.getPath());   
    } 
    System.out.println("websiteURL.getPath() " + isValid); 

    return validationResult; 
} 

在調試,我發現for (URL websiteURL : URLs)是給java.lang.ClassCastException: java.net.URI cannot be cast to java.net.URL錯誤。我怎樣才能讓自己的邏輯工作?

回答

1

真正的問題是在這裏:

@SuppressWarnings("unchecked") 
List<URL> URLs = (List<URL>)data; 

事實上,它會出現你調用這個代碼的對象,它是URI對象的列表,而不是URL對象的列表。無論如何,這些班級演員都是在隱藏演員陣容中發生的,當Iterator.next()對象返回的對象被分配到websiteURL時發生。

這是不是真的清楚怎樣纔是正確的解決方案是:

  • 你可以(可能)更改調用它來通過它包含URL對象列表的代碼...由預期驗證器。

  • 您可以將驗證程序更改爲在URI對象的列表上工作......從URLs變量的聲明開始。 (!YUCK難道沒有人解釋Java標識符約定給你?)

    @SuppressWarnings("unchecked") 
        List<URI> uris = (List<URI>)data; 
    
  • 你可以改變驗證通過改變上述聲明與URLURI對象工作...開始:

    List<?> urls = (List) data; 
    

    然後,在驗證它們之前,您需要使用instanceof來區分URIURL對象。

爲了記錄在案,順便轉換URIURL是調用URI.toURL()就可以了。

+0

當我在列表類型中提供URL時,它爲什麼將它轉換爲URI?我如何將它強制爲URL對象。 – CoderGuy

+0

1)它不會被轉換爲URI。它正被轉換爲「URL」。演員陣容正在發生>>因爲「您將列表類型聲明爲」列表「。 2)見我答案的最後一句。但是,您必須將'data'的未勾選轉換爲'List ',因爲這是有問題的。 –

相關問題