Cemo
Cemo

Reputation: 5570

Correct Generic Types for ClassToInstanceMap

I need to implement ContraintValidatorFactory interface which is the part of 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);
}

My implementation is

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);
         }
      }
   }

How Can I remove @SuppressWarnings("unchecked") at my implementation. You are free to modify InstanceAwareConstraintValidatorFactory.

In other words, I need to use correct generic parameters to provide a contract with my ClassToInstanceMap with getIntance method of the Interface.

Is it possible?

Upvotes: 1

Views: 294

Answers (1)

chirag
chirag

Reputation: 172

You can replace the following line,

return (T) instances.get(key);

with

return instances.getInstance(key);

I verified that guava 11 has this function.

Upvotes: 3

Related Questions