Почему мой компилятор не может преобразовать это?

#java #hibernate-validator

#java #переход в спящий режим-валидатор

Вопрос:

Ошибка:

 Type mismatch: cannot convert from Set<ConstraintViolation<capture#1-of ?>> to Set<ConstraintViolation<Class<?>>>
  

Мой код:

 public class validateValue(Class<?> beanType, String propertyName, Object value, Class<?>... groups){
    TraversableResolver tr = new MyTraversableResolver(); 
    Validator validator = Validation.buildDefaultValidatorFactory().usingContext().traversableResolver(tr).getValidator();
    final Set<ConstraintViolation<Class<?>>> constraintViolations = validator.validateValue(beanType, propertyName, value, groups);
}

private class MyTraversableResolver  implements TraversableResolver {

    public boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
      return traversableObject == null || Hibernate.isInitialized(traversableObject);
      }
      public boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
          return true;
      }
  }
  

Ответ №1:

Я думаю, проблема в том, что ваш компилятор не знает, что тип вашей переменной beanType соответствует set. Попробуйте что-то вроде этого (возможно, потребуется немного подправить код)

 public <T> class validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups)
  

Затем изменение:

  final Set<ConstraintViolation<Class<?>>>
  

Для

  final Set<ConstraintViolation<Class<T>>>
  

Ответ №2:

@JustinKSU прав насчет изменения подстановочного знака (?) на тип arg (T). Другая проблема заключается в том, что validator.validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) не возвращает набор нарушений ограничений для класса типа, который был бы:

 Set<ConstraintViolation<Class<T>>>
  

… но скорее это возвращает набор нарушений ограничений для типа:

 Set<ConstraintViolation<T>>
  

Разница небольшая, но она заметна, если внимательно просмотреть сообщение об ошибке и посчитать угловые скобки.

Итак, ваш код должен быть таким, как показано ниже. Я упростил создание средства проверки для целей примера. Я также добавил возвращаемое значение, поскольку предполагаю, что вы хотите что-то сделать с результатами.

 public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) {
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    final Set<ConstraintViolation<T>> constraintViolations = validator.validateValue(beanType, propertyName, value, groups);
    return constraintViolations;
}