guava/src/com/google/common/reflect/TypeToken.java
public final <X> TypeToken<T> where(TypeParameter<X> typeParam, Class<X> typeArg) {
    return where(typeParam, of(typeArg));
  }
public final <X> TypeToken<T> where(TypeParameter<X> typeParam, Class<X> typeArg) {
    return where(typeParam, of(typeArg));
  }
public final < X > TypeToken < T > where ( TypeParameter < X > typeParam , Class < X > typeArg ) { return where ( typeParam , of ( typeArg ) ) ; }
Returns a new {@code TypeToken} where type variables represented by {@code typeParam} are
substituted by {@code typeArg}. For example, it can be used to construct {@code Map<K, V>} for
any {@code K} and {@code V} type:

<pre>{@code
static <K, V> TypeToken<Map<K, V>> mapOf(
Class<K> keyType, Class<V> valueType) {
return new TypeToken<Map<K, V>>() {}
.where(new TypeParameter<K>() {}, keyType)
.where(new TypeParameter<V>() {}, valueType);
}
}</pre>

@param <X> The parameter type
@param typeParam the parameter type variable
@param typeArg the actual type to substitute
Returns a new { @code TypeToken } where type variables represented by { @code typeParam } are substituted by { @code typeArg } . For example it can be used to construct { @code Map<K V > } for any { @code K } and { @code V } type :