所需的 ? 类型捕获,前提是 T

edm*_*pie 9 java generics

为什么调用会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;
    }
}
Run Code Online (Sandbox Code Playgroud)

IValidator界面:


public interface IValidator<T> {
    boolean isValid(T t);
}

Run Code Online (Sandbox Code Playgroud)

ceg*_*dev 5

在这种情况下,您可能无法绕过强制转换,这意味着该validate方法如下所示:

@SuppressWarnings("unchecked")
@Override
public <T> boolean validate(T request) {
    if (validatorMap.containsKey(request.getClass())) {
        IValidator<T> val = (IValidator<T>) validatorMap.get(request.getClass());
        return val.isValid(request);
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)