【问题标题】:Required type capture of ?, provided T所需的类型捕获?,提供 T
【发布时间】: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&lt;T&gt; val = (IValidator&lt;T&gt;)validatorMap.get(request.getClass());
  • return ((IValidator&lt;T&gt;) val).isValid(request); 获得未经检查的警告并解决此问题怎么样。
  • 是否可以从MyClass&lt;?&gt; 转换为MyClass&lt;T&gt;

标签: java generics


【解决方案1】:

在这种情况下,您可能无法绕过强制转换,这意味着 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;
}

【讨论】:

  • 我以前试过。仍然出现类似错误:Required type: capture of ?, Provided: Object
  • 我已经更新了我的答案。它不漂亮,但可能是最好的。
  • 是否可以从IValidator&lt;?&gt; 转换为IValidator&lt;T&gt;
  • 应该是。不过,您必须对其进行测试。
猜你喜欢
  • 2019-03-22
  • 2021-06-03
  • 2020-08-24
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 2021-03-13
相关资源
最近更新 更多