我正在写一个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
错误。我如何让我的逻辑工作?
答案 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;
您可以更改验证程序以使用URL
和URI
个对象...首先将上述声明更改为:
List<?> urls = (List) data;
然后,您需要先使用instanceof
区分URI
和URL
个对象,然后再对其进行验证。
对于记录,将URI
转换为URL
的方式是在其上调用URI.toURL()
。