code: protected String argumentTypeString(final Type type) {
          if (type instanceof ParameterizedType) {
              final ParameterizedType parameterizedType = (ParameterizedType) type;
              final List<String> subs = new ArrayList<>();
              for (final Type actualType : parameterizedType.getActualTypeArguments())
                  subs.add(argumentTypeString(actualType));
              return argumentTypeString(((ParameterizedType) type).getRawType()) + "[" + String.join(",", subs) + "]";
          } else if (type instanceof GenericArrayType) {
              return argumentTypeString(((GenericArrayType) type).getGenericComponentType()) + "[]";
          } else if (type instanceof WildcardType) {
              throw new RuntimeException("We don't support wildcards in arguments: " + type);
          } else if (type instanceof Class<?>) {
              return ((Class) type).getSimpleName();
          } else {
              throw new DocException("Unknown type: " + type);
          }
      }
docs: Returns a human readable string that describes the Type type of an argument.
  
  This will include parametrized types, so that Set{T} shows up as Set(T) and not
  just Set in the docs.
  
  @param type
  @return String representing the argument type