code: @SuppressWarnings("PMD.UseStringBufferForStringAppends")
      public static String toStringType(final Type type, final Map<String, Type> generics) {
          final String res;
          if (type instanceof Class) {
              res = processClass((Class) type);
          } else if (type instanceof ParameterizedType) {
              res = processParametrizedType((ParameterizedType) type, generics);
          } else if (type instanceof GenericArrayType) {
              res = toStringType(((GenericArrayType) type).getGenericComponentType(), generics) + "[]";
          } else if (type instanceof WildcardType) {
              res = processWildcardType((WildcardType) type, generics);
          } else if (type instanceof ExplicitTypeVariable) {
              // print generic name (only when PrintableGenericsMap used)
              res = type.toString();
          } else {
              // deep generics nesting case
              // when PrintableGenericsMap used and generics is not known, will print generic name (see above)
              res = toStringType(declaredGeneric((TypeVariable) type, generics), generics);
          }
          return res;
      }
docs: Prints type as string. E.g. {@code toStringType(ParameterizedType(List, String), [:]) == "List<String>"},
  {@code toStringType(WildcardType(String), [:]) == "? extends String" }.
  <p>
  If {@link ParameterizedType} is inner class and contains information about outer generics, it will be printed
  as {@code Outer<Generics>.Inner<Generics>} in order to indicate all available information.
  In other cases outer class is not indicated.
  
  @param type     type to convert to string
  @param generics type class generics type
  @return string representation of provided type
  @throws UnknownGenericException when found generic not declared on type (e.g. method generic)
  @see ru.vyarus.java.generics.resolver.util.map.PrintableGenericsMap to print not known generic names
  @see #toStringTypeIgnoringVariables(Type) shortcut to print Object instead of not known generic
  @see #toStringType(Type) shortcut for types without variables