code: private static String parameterizedTypeToString(final ParameterizedType p) {
          final StringBuilder buf = new StringBuilder();
  
          final Type useOwner = p.getOwnerType();
          final Class<?> raw = (Class<?>) p.getRawType();
  
          if (useOwner == null) {
              buf.append(raw.getName());
          } else {
              if (useOwner instanceof Class<?>) {
                  buf.append(((Class<?>) useOwner).getName());
              } else {
                  buf.append(useOwner.toString());
              }
              buf.append('.').append(raw.getSimpleName());
          }
  
          final int[] recursiveTypeIndexes = findRecursiveTypes(p);
  
          if (recursiveTypeIndexes.length > 0) {
              appendRecursiveTypes(buf, recursiveTypeIndexes, p.getActualTypeArguments());
          } else {
              appendAllTo(buf.append('<'), ", ", p.getActualTypeArguments()).append('>');
          }
  
          return buf.toString();
      }
docs: Format a {@link ParameterizedType} as a {@link String}.
  
  @param p {@code ParameterizedType} to format
  @return String
  @since 3.2