@Override
 public <T> T getArgumentValue(String name) {
   Argument arg = cli.getArgument(name);
   if (arg == null) {
     return null;
   }
   return getArgumentValue(arg.getIndex());
 }
 @Override
 @SuppressWarnings("unchecked")
 public <T> T getArgumentValue(int index) {
   Argument arg = cli.getArgument(index);
   if (arg == null) {
     return null;
   }
   if (arg instanceof TypedArgument) {
     return create(getRawValueForArgument(arg), (TypedArgument<T>) arg);
   } else {
     return (T) getRawValueForArgument(arg);
   }
 }
 /**
  * Gets the values of an argument with the matching index.
  *
  * @param index the index
  * @return the values, {@code null} if not set
  * @see #getArgumentValue(int)
  * @see #getRawValueForArgument(Argument)
  */
 @Override
 @SuppressWarnings("unchecked")
 public <T> List<T> getArgumentValues(int index) {
   Argument argument = cli.getArgument(index);
   if (argument == null) {
     return null;
   }
   if (argument instanceof TypedArgument) {
     TypedArgument<T> typed = (TypedArgument<T>) argument;
     return getRawValuesForArgument(typed)
         .stream()
         .map(s -> create(s, typed))
         .collect(Collectors.toList());
   } else {
     return (List<T>) getRawValuesForArgument(argument);
   }
 }