Class TypeToken<T>
- java.lang.Object
-
- com.google.gson.reflect.TypeToken<T>
-
public class TypeToken<T> extends java.lang.Object
Represents a generic typeT
. Java doesn't yet provide a way to represent generic types, so this class does. Forces clients to create a subclass of this class which enables retrieval the type information even at runtime.For example, to create a type literal for
List<String>
, you can create an empty anonymous class:TypeToken<List<String>> list = new TypeToken<List<String>>() {};
Capturing a type variable as type argument of a
TypeToken
should be avoided. Due to type erasure the runtime type of a type variable is not available to Gson and therefore it cannot provide the functionality one might expect, which gives a false sense of type-safety at compilation time and can lead to an unexpectedClassCastException
at runtime.If the type arguments of the parameterized type are only available at runtime, for example when you want to create a
List<E>
based on aClass<E>
representing the element type, the methodgetParameterized(Type, Type...)
can be used.
-
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description private static java.lang.AssertionError
buildUnexpectedTypeError(java.lang.reflect.Type token, java.lang.Class<?>... expected)
boolean
equals(java.lang.Object o)
static <T> TypeToken<T>
get(java.lang.Class<T> type)
Gets type literal for the givenClass
instance.static TypeToken<?>
get(java.lang.reflect.Type type)
Gets type literal for the givenType
instance.static TypeToken<?>
getArray(java.lang.reflect.Type componentType)
Gets type literal for the array type whose elements are all instances ofcomponentType
.static TypeToken<?>
getParameterized(java.lang.reflect.Type rawType, java.lang.reflect.Type... typeArguments)
Gets a type literal for the parameterized type represented by applyingtypeArguments
torawType
.java.lang.Class<? super T>
getRawType()
Returns the raw (non-generic) type for this type.java.lang.reflect.Type
getType()
Gets underlyingType
instance.private java.lang.reflect.Type
getTypeTokenTypeArgument()
Verifies thatthis
is an instance of a direct subclass of TypeToken and returns the type argument forT
incanonical form
.int
hashCode()
boolean
isAssignableFrom(TypeToken<?> token)
Deprecated.this implementation may be inconsistent with javac for types with wildcards.boolean
isAssignableFrom(java.lang.Class<?> cls)
Deprecated.this implementation may be inconsistent with javac for types with wildcards.boolean
isAssignableFrom(java.lang.reflect.Type from)
Deprecated.this implementation may be inconsistent with javac for types with wildcards.private static boolean
isAssignableFrom(java.lang.reflect.Type from, java.lang.reflect.GenericArrayType to)
Private helper function that performs some assignability checks for the provided GenericArrayType.private static boolean
isAssignableFrom(java.lang.reflect.Type from, java.lang.reflect.ParameterizedType to, java.util.Map<java.lang.String,java.lang.reflect.Type> typeVarMap)
Private recursive helper function to actually do the type-safe checking of assignability.private static boolean
matches(java.lang.reflect.Type from, java.lang.reflect.Type to, java.util.Map<java.lang.String,java.lang.reflect.Type> typeMap)
Checks if two types are the same or are equivalent under a variable mapping given in the type map that was provided.java.lang.String
toString()
private static boolean
typeEquals(java.lang.reflect.ParameterizedType from, java.lang.reflect.ParameterizedType to, java.util.Map<java.lang.String,java.lang.reflect.Type> typeVarMap)
Checks if two parameterized types are exactly equal, under the variable replacement described in the typeVarMap.
-
-
-
Field Detail
-
rawType
private final java.lang.Class<? super T> rawType
-
type
private final java.lang.reflect.Type type
-
hashCode
private final int hashCode
-
-
Constructor Detail
-
TypeToken
protected TypeToken()
Constructs a new type literal. Derives represented class from type parameter.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.
-
TypeToken
private TypeToken(java.lang.reflect.Type type)
Unsafe. Constructs a type literal manually.
-
-
Method Detail
-
getTypeTokenTypeArgument
private java.lang.reflect.Type getTypeTokenTypeArgument()
Verifies thatthis
is an instance of a direct subclass of TypeToken and returns the type argument forT
incanonical form
.
-
getRawType
public final java.lang.Class<? super T> getRawType()
Returns the raw (non-generic) type for this type.
-
getType
public final java.lang.reflect.Type getType()
Gets underlyingType
instance.
-
isAssignableFrom
@Deprecated public boolean isAssignableFrom(java.lang.Class<?> cls)
Deprecated.this implementation may be inconsistent with javac for types with wildcards.Check if this type is assignable from the given class object.
-
isAssignableFrom
@Deprecated public boolean isAssignableFrom(java.lang.reflect.Type from)
Deprecated.this implementation may be inconsistent with javac for types with wildcards.Check if this type is assignable from the given Type.
-
isAssignableFrom
@Deprecated public boolean isAssignableFrom(TypeToken<?> token)
Deprecated.this implementation may be inconsistent with javac for types with wildcards.Check if this type is assignable from the given type token.
-
isAssignableFrom
private static boolean isAssignableFrom(java.lang.reflect.Type from, java.lang.reflect.GenericArrayType to)
Private helper function that performs some assignability checks for the provided GenericArrayType.
-
isAssignableFrom
private static boolean isAssignableFrom(java.lang.reflect.Type from, java.lang.reflect.ParameterizedType to, java.util.Map<java.lang.String,java.lang.reflect.Type> typeVarMap)
Private recursive helper function to actually do the type-safe checking of assignability.
-
typeEquals
private static boolean typeEquals(java.lang.reflect.ParameterizedType from, java.lang.reflect.ParameterizedType to, java.util.Map<java.lang.String,java.lang.reflect.Type> typeVarMap)
Checks if two parameterized types are exactly equal, under the variable replacement described in the typeVarMap.
-
buildUnexpectedTypeError
private static java.lang.AssertionError buildUnexpectedTypeError(java.lang.reflect.Type token, java.lang.Class<?>... expected)
-
matches
private static boolean matches(java.lang.reflect.Type from, java.lang.reflect.Type to, java.util.Map<java.lang.String,java.lang.reflect.Type> typeMap)
Checks if two types are the same or are equivalent under a variable mapping given in the type map that was provided.
-
hashCode
public final int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
equals
public final boolean equals(java.lang.Object o)
- Overrides:
equals
in classjava.lang.Object
-
toString
public final java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
get
public static TypeToken<?> get(java.lang.reflect.Type type)
Gets type literal for the givenType
instance.
-
get
public static <T> TypeToken<T> get(java.lang.Class<T> type)
Gets type literal for the givenClass
instance.
-
getParameterized
public static TypeToken<?> getParameterized(java.lang.reflect.Type rawType, java.lang.reflect.Type... typeArguments)
Gets a type literal for the parameterized type represented by applyingtypeArguments
torawType
. This is mainly intended for situations where the type arguments are not available at compile time. The following example shows how a type token forMap<K, V>
can be created:
As seen here the result is aClass<K> keyClass = ...; Class<V> valueClass = ...; TypeToken<?> mapTypeToken = TypeToken.getParameterized(Map.class, keyClass, valueClass);
TypeToken<?>
; this method cannot provide any type safety, and care must be taken to pass in the correct number of type arguments.- Throws:
java.lang.IllegalArgumentException
- IfrawType
is not of typeClass
, or if the type arguments are invalid for the raw type
-
getArray
public static TypeToken<?> getArray(java.lang.reflect.Type componentType)
Gets type literal for the array type whose elements are all instances ofcomponentType
.
-
-