java.lang.ClassCastException:java.net.URI无法强制转换为java.net.URL

时间:2015-04-07 07:25:57

标签: java casting classcastexception

我正在写一个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 个答案:

答案 0 :(得分:1)

真正的问题在于:

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

实际上,您似乎使用的对象调用此代码,该对象是URI个对象的列表,而不是URL个对象的列表。无论如何,当Iterator.next()对象返回的对象被分配给websiteURL时,会发生隐藏的强制转换。

目前尚不清楚对此的正确解决方案是什么:

  • 您可以(可能)更改调用此代码的代码,将其传递给包含URL个对象的列表...正如验证程序所期望的那样。

  • 您可以更改验证程序以处理URI对象列表...从URLs变量的声明开始。 (你好!没有人向你解释Java标识符约定吗??)

      @SuppressWarnings("unchecked")
      List<URI> uris = (List<URI>)data;
    
  • 您可以更改验证程序以使用URLURI个对象...首先将上述声明更改为:

      List<?> urls = (List) data;
    

    然后,您需要先使用instanceof区分URIURL个对象,然后再对其进行验证。

对于记录,将URI转换为URL的方式是在其上调用URI.toURL()