更正ClassToInstanceMap的通用类型

时间:2012-10-10 08:18:41

标签: java generics guava

我需要实现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方法。

有可能吗?

1 个答案:

答案 0 :(得分:3)

您可以替换以下行

return (T) instances.get(key);

return instances.getInstance(key);

我确认guava 11具有此功能。