guava/src/com/google/common/reflect/TypeToken.java
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;
  }
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;
  }
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>