docs: @Override
      @SuppressWarnings("ConstantConditions")
      @Nonnull
      public <T> Set<ConstraintViolation<T>> validate(@Nonnull BeanIntrospection<T> introspection, @Nonnull T object, @Nullable Class<?>... groups) {
          if (introspection == null) {
              throw new ValidationException("Passed object [" + object + "] cannot be introspected. Please annotate with @Introspected");
          }
          @SuppressWarnings("unchecked")
          final Collection<? extends BeanProperty<Object, Object>> constrainedProperties =
                  ((BeanIntrospection<Object>) introspection).getIndexedProperties(Constraint.class);
          @SuppressWarnings("unchecked")
          final Collection<BeanProperty<Object, Object>> cascadeProperties =
                  ((BeanIntrospection<Object>) introspection).getIndexedProperties(Valid.class);
  
          if (CollectionUtils.isNotEmpty(constrainedProperties) || CollectionUtils.isNotEmpty(cascadeProperties)) {
              DefaultConstraintValidatorContext context = new DefaultConstraintValidatorContext(object, groups);
              Set<ConstraintViolation<T>> overallViolations = new HashSet<>(5);
              return doValidate(
                      object,
                      object,
                      constrainedProperties,
                      cascadeProperties,
                      context,
                      overallViolations
              );
          }
          return Collections.emptySet();
      }