Class TypeLiteral<T>


  • public class TypeLiteral<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 of the type information even at runtime.

    For example, to create a type literal for List<String>, you can create an empty anonymous inner class:

    TypeLiteral<List<String>> list = new TypeLiteral<List<String>>() {};

    Along with modeling generic types, this class can resolve type parameters. For example, to figure out what type keySet() returns on a Map<Integer, String>, use this code:

    
     TypeLiteral<Map<Integer, String>> mapType
         = new TypeLiteral<Map<Integer, String>>() {};
     TypeLiteral<?> keySetType
         = mapType.getReturnType(Map.class.getMethod("keySet"));
     System.out.println(keySetType); // prints "Set<Integer>"
     
    • Field Summary

      Fields 
      Modifier and Type Field Description
      (package private) int hashCode  
      (package private) java.lang.Class<? super T> rawType  
      (package private) java.lang.reflect.Type type  
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      protected TypeLiteral()
      Constructs a new type literal.
      (package private) TypeLiteral​(java.lang.reflect.Type type)
      Unsafe.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      boolean equals​(java.lang.Object o)  
      (package private) static TypeLiteral<?> fromSuperclassTypeParameter​(java.lang.Class<?> subclass)
      Gets type literal from super class's type parameter.
      static <T> TypeLiteral<T> get​(java.lang.Class<T> type)
      Gets type literal for the given Class instance.
      static TypeLiteral<?> get​(java.lang.reflect.Type type)
      Gets type literal for the given Type instance.
      java.util.List<TypeLiteral<?>> getExceptionTypes​(java.lang.reflect.Member methodOrConstructor)
      Returns the resolved generic exception types thrown by constructor.
      TypeLiteral<?> getFieldType​(java.lang.reflect.Field field)
      Returns the resolved generic type of field.
      java.util.List<TypeLiteral<?>> getParameterTypes​(java.lang.reflect.Member methodOrConstructor)
      Returns the resolved generic parameter types of methodOrConstructor.
      java.lang.Class<? super T> getRawType()
      Returns the raw (non-generic) type for this type.
      TypeLiteral<?> getReturnType​(java.lang.reflect.Method method)
      Returns the resolved generic return type of method.
      (package private) static java.lang.reflect.Type getSuperclassTypeParameter​(java.lang.Class<?> subclass)
      Returns the type from super class's type parameter in canonical form.
      TypeLiteral<?> getSupertype​(java.lang.Class<?> supertype)
      Returns the generic form of supertype.
      java.lang.reflect.Type getType()
      Gets underlying Type instance.
      int hashCode()  
      (package private) TypeLiteral<Provider<T>> providerType()
      Gets the type of this type's provider.
      (package private) TypeLiteral<?> resolve​(java.lang.reflect.Type toResolve)
      Resolves known type parameters in toResolve and returns the result.
      private java.util.List<TypeLiteral<?>> resolveAll​(java.lang.reflect.Type[] types)
      Returns an immutable list of the resolved types.
      (package private) java.lang.reflect.Type resolveType​(java.lang.reflect.Type toResolve)  
      java.lang.String toString()  
      • Methods inherited from class java.lang.Object

        clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    • Field Detail

      • rawType

        final java.lang.Class<? super T> rawType
      • type

        final java.lang.reflect.Type type
      • hashCode

        final int hashCode
    • Constructor Detail

      • TypeLiteral

        protected TypeLiteral()
        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.

      • TypeLiteral

        TypeLiteral​(java.lang.reflect.Type type)
        Unsafe. Constructs a type literal manually.
    • Method Detail

      • getSuperclassTypeParameter

        static java.lang.reflect.Type getSuperclassTypeParameter​(java.lang.Class<?> subclass)
        Returns the type from super class's type parameter in canonical form.
      • fromSuperclassTypeParameter

        static TypeLiteral<?> fromSuperclassTypeParameter​(java.lang.Class<?> subclass)
        Gets type literal from super class's type parameter.
      • getRawType

        public final java.lang.Class<? super T> getRawType()
        Returns the raw (non-generic) type for this type.
        Since:
        2.0
      • getType

        public final java.lang.reflect.Type getType()
        Gets underlying Type instance.
      • providerType

        final TypeLiteral<Provider<T>> providerType()
        Gets the type of this type's provider.
      • 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 TypeLiteral<?> get​(java.lang.reflect.Type type)
        Gets type literal for the given Type instance.
      • get

        public static <T> TypeLiteral<T> get​(java.lang.Class<T> type)
        Gets type literal for the given Class instance.
      • resolveAll

        private java.util.List<TypeLiteral<?>> resolveAll​(java.lang.reflect.Type[] types)
        Returns an immutable list of the resolved types.
      • resolve

        TypeLiteral<?> resolve​(java.lang.reflect.Type toResolve)
        Resolves known type parameters in toResolve and returns the result.
      • resolveType

        java.lang.reflect.Type resolveType​(java.lang.reflect.Type toResolve)
      • getSupertype

        public TypeLiteral<?> getSupertype​(java.lang.Class<?> supertype)
        Returns the generic form of supertype. For example, if this is ArrayList<String>, this returns Iterable<String> given the input Iterable.class.
        Parameters:
        supertype - a superclass of, or interface implemented by, this.
        Since:
        2.0
      • getFieldType

        public TypeLiteral<?> getFieldType​(java.lang.reflect.Field field)
        Returns the resolved generic type of field.
        Parameters:
        field - a field defined by this or any superclass.
        Since:
        2.0
      • getParameterTypes

        public java.util.List<TypeLiteral<?>> getParameterTypes​(java.lang.reflect.Member methodOrConstructor)
        Returns the resolved generic parameter types of methodOrConstructor.
        Parameters:
        methodOrConstructor - a method or constructor defined by this or any supertype.
        Since:
        2.0
      • getExceptionTypes

        public java.util.List<TypeLiteral<?>> getExceptionTypes​(java.lang.reflect.Member methodOrConstructor)
        Returns the resolved generic exception types thrown by constructor.
        Parameters:
        methodOrConstructor - a method or constructor defined by this or any supertype.
        Since:
        2.0
      • getReturnType

        public TypeLiteral<?> getReturnType​(java.lang.reflect.Method method)
        Returns the resolved generic return type of method.
        Parameters:
        method - a method defined by this or any supertype.
        Since:
        2.0