code: static Type getSupertype(Type context, Class<?> contextRawType, Class<?> supertype) {
      if (!supertype.isAssignableFrom(contextRawType)) {
        throw new IllegalArgumentException();
      }
      return resolve(context, contextRawType,
          getGenericSupertype(context, contextRawType, supertype));
    }
docs: Returns the generic form of {@code supertype}. For example, if this is {@code
  ArrayList<String>}, this returns {@code Iterable<String>} given the input {@code
  Iterable.class}.
  
  @param supertype a superclass of, or interface implemented by, this.