@Beta public abstract class TypeToken<T> extends Object implements Serializable
A Type with generics.
Operations that are otherwise only available in Class are implemented to support Type, for example isSubtypeOf(com.diffplug.common.reflect.TypeToken<?>), isArray() and getComponentType(). It also provides additional utilities such as getTypes(), resolveType(java.lang.reflect.Type), etc.
There are three ways to get a TypeToken instance:
Type obtained via reflection. For example: TypeToken.of(method.getGenericReturnType()).
new TypeToken<List<String>>() {} Note that it’s critical that the actual type argument is carried by a subclass. The following code is wrong because it only captures the <T> type variable of the listType() method signature; while <String> is lost in erasure:
class Util {
static <T> TypeToken<List<T>> listType() {
return new TypeToken<List<T>>() {}; } }</p>
<p>TypeToken<List<String>> stringListType = Util.<String>listType();
abstract class IKnowMyType<T> {
TypeToken<T> type = new TypeToken<T>(getClass()) {}; } new IKnowMyType<String>() {}.type => String TypeToken is serializable when no type variable is contained in the type.
Note to Guice users: TypeToken is similar to Guice’s TypeLiteral class except that it is serializable and offers numerous additional utility methods.
| Modifier and Type | Class and Description |
|---|---|
class |
TypeToken.TypeSet
The set of interfaces and classes that
T is or is a subtype of. |
| Modifier | Constructor and Description |
|---|---|
protected |
TypeToken()
Constructs a new type token of
T. |
protected |
TypeToken(Class<?> declaringClass)
Constructs a new type token of
T while resolving free type variables in the context of declaringClass. |
| Modifier and Type | Method and Description |
|---|---|
Invokable<T,T> |
constructor(Constructor<?> constructor)
|
boolean |
equals(Object o)
|
TypeToken<?> |
getComponentType()
Returns the array component type if this type represents an array (
int[], T[], <? extends Map<String, Integer>[]> etc.), or else null is returned. |
Class<? super T> |
getRawType()
Returns the raw type of
T. |
TypeToken<? extends T> |
getSubtype(Class<?> subclass)
Returns subtype of
this with subclass as the raw class. |
TypeToken<? super T> |
getSupertype(Class<? super T> superclass)
Returns the generic form of
superclass. |
Type |
getType()
Returns the represented type.
|
TypeToken.TypeSet |
getTypes()
Returns the set of interfaces and classes that this type is or is a subtype of.
|
int |
hashCode() |
boolean |
isArray()
Returns true if this type is known to be an array type, such as
int[], T[], <? extends Map<String, Integer>[]> etc. |
boolean |
isPrimitive()
Returns true if this type is one of the nine primitive types (including
void). |
boolean |
isSubtypeOf(Type supertype)
Returns true if this type is a subtype of the given
type. |
boolean |
isSubtypeOf(TypeToken<?> type)
Returns true if this type is a subtype of the given
type. |
boolean |
isSupertypeOf(Type type)
Returns true if this type is a supertype of the given
type. |
boolean |
isSupertypeOf(TypeToken<?> type)
Returns true if this type is a supertype of the given
type. |
Invokable<T,Object> |
method(Method method)
|
static <T> TypeToken<T> |
of(Class<T> type)
Returns an instance of type token that wraps
type. |
static TypeToken<?> |
of(Type type)
Returns an instance of type token that wraps
type. |
TypeToken<?> |
resolveType(Type type) |
String |
toString() |
TypeToken<T> |
unwrap()
Returns the corresponding primitive type if this is a wrapper type; otherwise returns
this itself. |
<X> TypeToken<T> |
where(TypeParameter<X> typeParam,
Class<X> typeArg) |
<X> TypeToken<T> |
where(TypeParameter<X> typeParam,
TypeToken<X> typeArg) |
TypeToken<T> |
wrap()
Returns the corresponding wrapper type if this is a primitive type; otherwise returns
this itself. |
protected Object |
writeReplace()
Implemented to support serialization of subclasses.
|
protected TypeToken()
Constructs a new type token of T.
Clients create an empty anonymous subclass. Doing so embeds the type parameter in the anonymous class’s type hierarchy so we can reconstitute it at runtime despite erasure.
For example:
TypeToken<List<String>> t = new TypeToken<List<String>>() {};protected TypeToken(Class<?> declaringClass)
Constructs a new type token of T while resolving free type variables in the context of declaringClass.
Clients create an empty anonymous subclass. Doing so embeds the type parameter in the anonymous class’s type hierarchy so we can reconstitute it at runtime despite erasure.
For example:
abstract class IKnowMyType<T> {
TypeToken<T> getMyType() {
return new TypeToken<T>(getClass()) {}; } }</p>
<p>new IKnowMyType<String>() {}.getMyType() => Stringpublic static <T> TypeToken<T> of(Class<T> type)
Returns an instance of type token that wraps type.
public final Class<? super T> getRawType()
Returns the raw type of T. Formally speaking, if T is returned by Method.getGenericReturnType(), the raw type is what’s returned by Method.getReturnType() of the same method object. Specifically:
T is a Class itself, T itself is returned. T is a ParameterizedType, the raw type of the parameterized type is returned. T is a GenericArrayType, the returned type is the corresponding array class. For example: List<Integer>[] => List[]. T is a type variable or a wildcard type, the raw type of the first upper bound is returned. For example: <X extends Foo> => Foo. public final Type getType()
Returns the represented type.
public final <X> TypeToken<T> where(TypeParameter<X> typeParam, TypeToken<X> typeArg)
Returns a new TypeToken where type variables represented by typeParam are substituted by typeArg. For example, it can be used to construct Map<K, V> for any K and V type:
static <K, V> TypeToken<Map<K, V>> mapOf(
TypeToken<K> keyType, TypeToken<V> valueType) {
return new TypeToken<Map<K, V>>() {} .where(new TypeParameter<K>() {}, keyType) .where(new TypeParameter<V>() {}, valueType); }X - The parameter typetypeParam - the parameter type variabletypeArg - the actual type to substitutepublic final <X> TypeToken<T> where(TypeParameter<X> typeParam, Class<X> typeArg)
Returns a new TypeToken where type variables represented by typeParam are substituted by typeArg. For example, it can be used to construct Map<K, V> for any K and V type:
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); }X - The parameter typetypeParam - the parameter type variabletypeArg - the actual type to substitutepublic final TypeToken<?> resolveType(Type type)
Resolves the given type against the type context represented by this type. For example:
new TypeToken<List<String>>() {}.resolveType( List.class.getMethod(“get”, int.class).getGenericReturnType()) => String.classpublic final TypeToken.TypeSet getTypes()
Returns the set of interfaces and classes that this type is or is a subtype of. The returned types are parameterized with proper type arguments.
Subtypes are always listed before supertypes. But the reverse is not true. A type isn’t necessarily a subtype of all the types following. Order between types without subtype relationship is arbitrary and not guaranteed.
If this type is a type variable or wildcard, upper bounds that are themselves type variables aren’t included (their super interfaces and superclasses are).
public final TypeToken<? super T> getSupertype(Class<? super T> superclass)
Returns the generic form of superclass. For example, if this is ArrayList<String>, Iterable<String> is returned given the input Iterable.class.
public final TypeToken<? extends T> getSubtype(Class<?> subclass)
Returns subtype of this with subclass as the raw class. For example, if this is Iterable<String> and subclass is List, List<String> is returned.
public final boolean isSupertypeOf(TypeToken<?> type)
Returns true if this type is a supertype of the given type. “Supertype” is defined according to the rules for type arguments introduced with Java generics.
public final boolean isSupertypeOf(Type type)
Returns true if this type is a supertype of the given type. “Supertype” is defined according to the rules for type arguments introduced with Java generics.
public final boolean isSubtypeOf(TypeToken<?> type)
Returns true if this type is a subtype of the given type. “Subtype” is defined according to the rules for type arguments introduced with Java generics.
public final boolean isSubtypeOf(Type supertype)
Returns true if this type is a subtype of the given type. “Subtype” is defined according to the rules for type arguments introduced with Java generics.
public final boolean isArray()
Returns true if this type is known to be an array type, such as int[], T[], <? extends Map<String, Integer>[]> etc.
public final boolean isPrimitive()
Returns true if this type is one of the nine primitive types (including void).
public final TypeToken<T> wrap()
Returns the corresponding wrapper type if this is a primitive type; otherwise returns this itself. Idempotent.
public final TypeToken<T> unwrap()
Returns the corresponding primitive type if this is a wrapper type; otherwise returns this itself. Idempotent.
@Nullable public final TypeToken<?> getComponentType()
Returns the array component type if this type represents an array (int[], T[], <? extends Map<String, Integer>[]> etc.), or else null is returned.
public final Invokable<T,Object> method(Method method)
Returns the Invokable for method, which must be a member of T.
public final Invokable<T,T> constructor(Constructor<?> constructor)
Returns the Invokable for constructor, which must be a member of T.
public boolean equals(@Nullable Object o)
Returns true if o is another TypeToken that represents the same Type.
protected Object writeReplace()
Implemented to support serialization of subclasses.