我需要实现ContraintValidatorFactory接口,这是jsr303的一部分
public interface ConstraintValidatorFactory {
/**
* @param key The class of the constraint validator to instantiate.
*
* @return A constraint validator instance of the specified class.
*/
<T extends ConstraintValidator<?,?>> T getInstance(Class<T> key);
}
我的实现是
private static class InstanceAwareConstraintValidatorFactory implements ConstraintValidatorFactory {
private ClassToInstanceMap<ConstraintValidator> instances = MutableClassToInstanceMap.create();
@SuppressWarnings("unchecked")
@Override
public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
if(instances.containsKey(key)) {
return (T) instances.get(key);
}
return ReflectionHelper.newInstance(key, "ConstraintValidator");
}
public void addContraintValidation(ConstraintValidator constraintValidator) {
instances.put(constraintValidator.getClass(), constraintValidator);
}
public void addContraintValidations(Set<ConstraintValidator<?, ?>> constraintValidators) {
for(ConstraintValidator<?,?> constraintValidator : constraintValidators) {
instances.put(constraintValidator.getClass(), constraintValidator);
}
}
}
如何在实施时删除
@SuppressWarnings("unchecked")
。您可以自由修改InstanceAwareConstraintValidatorFactory
。换句话说,我需要使用正确的泛型参数来提供与我的ClassToInstanceMap以及接口的getIntance方法的协定。
可能吗?
最佳答案
您可以替换以下行,
return (T) instances.get(key);
与
return instances.getInstance(key);
我验证了guava 11具有此功能。