Class TypeToken<T>


  • public class TypeToken<T>
    extends java.lang.Object
    Represents a generic type T. 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 an anonymous TypeToken subclass is not allowed, for example TypeToken<List<T>>. 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. This would give a false sense of type-safety at compile time and could lead to an unexpected ClassCastException 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 a Class<E> representing the element type, the method getParameterized(Type, Type...) can be used.

    Author:
    Bob Lee, Sven Mawson, Jesse Wilson
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      protected TypeToken()
      Constructs a new type literal.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods 
      Modifier and Type Method Description
      boolean equals​(java.lang.Object o)  
      static <T> TypeToken<T> get​(java.lang.Class<T> type)
      Gets type literal for the given Class instance.
      static TypeToken<?> get​(java.lang.reflect.Type type)
      Gets type literal for the given Type instance.
      static TypeToken<?> getArray​(java.lang.reflect.Type componentType)
      Gets type literal for the array type whose elements are all instances of componentType.
      static TypeToken<?> getParameterized​(java.lang.reflect.Type rawType, java.lang.reflect.Type... typeArguments)
      Gets a type literal for the parameterized type represented by applying typeArguments to rawType.
      java.lang.Class<? super T> getRawType()
      Returns the raw (non-generic) type for this type.
      java.lang.reflect.Type getType()
      Gets underlying Type instance.
      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.
      java.lang.String toString()  
      • Methods inherited from class java.lang.Object

        clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    • 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, for example:

        new TypeToken<List<String>>() {}

        Throws:
        java.lang.IllegalArgumentException - If the anonymous TypeToken subclass captures a type variable, for example TypeToken<List<T>>. See the TypeToken class documentation for more details.
    • Method Detail

      • 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 underlying Type 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.
      • hashCode

        public final int hashCode()
        Overrides:
        hashCode in class java.lang.Object
      • equals

        public final boolean equals​(java.lang.Object o)
        Overrides:
        equals in class java.lang.Object
      • toString

        public final java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • get

        public static TypeToken<?> get​(java.lang.reflect.Type type)
        Gets type literal for the given Type instance.
      • get

        public static <T> TypeToken<T> get​(java.lang.Class<T> type)
        Gets type literal for the given Class 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 applying typeArguments to rawType. This is mainly intended for situations where the type arguments are not available at compile time. The following example shows how a type token for Map<K, V> can be created:
        
         Class<K> keyClass = ...;
         Class<V> valueClass = ...;
         TypeToken<?> mapTypeToken = TypeToken.getParameterized(Map.class, keyClass, valueClass);
         
        As seen here the result is a TypeToken<?>; this method cannot provide any type-safety, and care must be taken to pass in the correct number of type arguments.

        If rawType is a non-generic class and no type arguments are provided, this method simply delegates to get(Class) and creates a TypeToken(Class).

        Throws:
        java.lang.IllegalArgumentException - If rawType is not of type Class, 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 of componentType.