code: @Override
      public <T> T convertValues(Collection<String> input, Class<T> rawType, Type type, String defaultValue) throws IllegalArgumentException {
          if (rawType.isArray()) {
              if (input == null) {
                  input = getMultipleValues(defaultValue, null);
              }
              return createArray(input, rawType.getComponentType());
          } else if (Collection.class.isAssignableFrom(rawType)) {
              if (input == null) {
                  input = getMultipleValues(defaultValue, null);
              }
              return createCollection(input, rawType, type);
          } else {
              return convertSingleValue(input, rawType, defaultValue);
          }
      }
docs: Creates an instance of T from the given input. Unlike {@link #convertValue(String, Class,
  java.lang.reflect.Type, String)}, this method support multi-value parameters.
  
  @param input        the input Strings, may be {@literal null} or empty
  @param rawType      the target class
  @param type         the type representation of the raw type, may contains metadata about generics
  @param defaultValue the default value if any
  @return the created object
  @throws IllegalArgumentException if there are no converter available from the type T at the moment