【发布时间】:2020-03-22 10:14:05
【问题描述】:
为什么调用val.isValid(request) 会出现编译错误Required: type capture of ?, provided: T?
我该如何解决这个错误?
public class RequestValidator implements IRequestValidator{
private Map<Class<?>, IValidator<?>> validatorMap;
public RequestValidator() {
validatorMap = new HashMap<>();
}
@Override
public <T> void registerValidator(Class<T> clazz, IValidator<T> validator) {
validatorMap.put(clazz, validator);
}
@Override
public <T> boolean validate(T request) {
if (validatorMap.containsKey(request.getClass())) {
IValidator<?> val = validatorMap.get(request.getClass());
return val.isValid(request);
}
return true;
}
}
IValidator接口:
public interface IValidator<T> {
boolean isValid(T t);
}
【问题讨论】:
-
isValid()的类型签名是什么?IValidator等来自哪个库?如果这是一个受欢迎的图书馆,请相应地标记以吸引专家。 -
这是我自己定义的接口。
-
这不能以类型安全的方式完成。您必须在某处进行不安全的强制转换,例如:
IValidator<T> val = (IValidator<T>)validatorMap.get(request.getClass()); -
return ((IValidator<T>) val).isValid(request);获得未经检查的警告并解决此问题怎么样。 -
是否可以从
MyClass<?>转换为MyClass<T>?