code: private List<Object> adjustArgs(List<String> args, Method m) {
      final List<Object> result = new ArrayList<Object>();
      final Class<?>[] types = m.getParameterTypes();
      if (m.isVarArgs()) {
        types[types.length - 1] = types[types.length - 1].getComponentType();
        if (!String.class.isAssignableFrom(types[types.length - 1])) {
          throw new CliException("Only String varargs is supported.");
        }
        types[types.length - 1] = String.class;
      }
  
      List<Object> varargs = new ArrayList<>();
      for (int i = 0; i < args.size(); i++) {
        try {
          if (m.isVarArgs() && i >= types.length - 1) {
            varargs.add(c.convert(args.get(i), types[types.length - 1]));
          } else {
            result.add(c.convert(args.get(i), types[i]));
          }
        } catch (ConversionException e) {
          throw CliException.WRONG_ARG_TYPE(getArguments().get(i).getName(),
                  types[i].getName(), args.get(i));
        }
      }
      if (m.isVarArgs()) {
        result.add(varargs.toArray(new String[0]));
      }
      return result;
    }
docs: Add or remove parameters to fit the method declaration and also convert them
  to appropriate data type.