code: public final Class<? super T> getRawType() {
      // For wildcard or type variable, the first bound determines the runtime type.
      Class<?> rawType = getRawTypes().iterator().next();
      @SuppressWarnings("unchecked") // raw type is |T|
      Class<? super T> result = (Class<? super T>) rawType;
      return result;
    }
docs: Returns the raw type of {@code T}. Formally speaking, if {@code T} is returned by {@link
  java.lang.reflect.Method#getGenericReturnType}, the raw type is what's returned by {@link
  java.lang.reflect.Method#getReturnType} of the same method object. Specifically:
  
  <ul>
  <li>If {@code T} is a {@code Class} itself, {@code T} itself is returned.
  <li>If {@code T} is a {@link ParameterizedType}, the raw type of the parameterized type is
  returned.
  <li>If {@code T} is a {@link GenericArrayType}, the returned type is the corresponding array
  class. For example: {@code List<Integer>[] => List[]}.
  <li>If {@code T} is a type variable or a wildcard type, the raw type of the first upper bound
  is returned. For example: {@code <X extends Foo> => Foo}.
  </ul>