@Override
    public String toString() {
      StringBuilder result = new StringBuilder(30 * (typeArguments.length + 1));
      result.append(typeToString(rawType));
      if (typeArguments.length == 0) {
        return result.toString();
      }
      result.append("<").append(typeToString(typeArguments[0]));
      for (int i = 1; i < typeArguments.length; i++) {
        result.append(", ").append(typeToString(typeArguments[i]));
      }
      return result.append(">").toString();
    }
Resolves the last type parameter of the parameterized {@code supertype}, based on the {@code
genericContext}, into its upper bounds.

<p>Implementation copied from {@code retrofit.RestMethodInfo}.

@param genericContext Ex. {@link java.lang.reflect.Field#getGenericType()}
@param supertype Ex. {@code Decoder.class}
@return in the example above, the type parameter of {@code Decoder}.
@throws IllegalStateException if {@code supertype} cannot be resolved into a parameterized type
    using {@code context}.
core/src/main/java/feign/Types.java