我正在编写一个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
错误。如何使我的逻辑工作?
真正的问题在这里:
@SuppressWarnings("unchecked")
List<URL> URLs = (List<URL>)data;
事实上,调用此代码的对象似乎是URI
对象列表,而不是URL
对象列表。无论如何,类强制转换是在隐藏强制转换中发生的,当Iterator.next()
对象返回的对象被分配给websiteURL
时就会发生这种情况。
目前还不清楚正确的解决方案是什么:
您可以(可能)更改调用它的代码,向它传递一个包含
URL
对象的列表。。。正如验证器所期望的那样。您可以更改验证器以处理
URI
对象列表。。。从CCD_ 9变量的声明开始。(见鬼!难道没有人向你解释Java标识符约定吗?)@SuppressWarnings("unchecked") List<URI> uris = (List<URI>)data;
您可以更改验证器以使用
URL
和URI
对象。。。首先将上述声明更改为:List<?> urls = (List) data;
然后,在验证
URI
和URL
对象之前,需要使用instanceof
来区分它们。
对于记录,将URI
转换为URL
的方法是在其上调用URI.toURL()