public class TypeLiteral<T>
extends java.lang.Object
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 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>"
Modifier and Type | Field and Description |
---|---|
(package private) int |
hashCode |
(package private) java.lang.Class<? super T> |
rawType |
(package private) java.lang.reflect.Type |
type |
Modifier | Constructor and Description |
---|---|
protected |
TypeLiteral()
Constructs a new type literal.
|
(package private) |
TypeLiteral(java.lang.reflect.Type type)
Unsafe.
|
Modifier and Type | Method and 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() |
final java.lang.Class<? super T> rawType
final java.lang.reflect.Type type
final int hashCode
protected TypeLiteral()
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(java.lang.reflect.Type type)
static java.lang.reflect.Type getSuperclassTypeParameter(java.lang.Class<?> subclass)
canonical form
.static TypeLiteral<?> fromSuperclassTypeParameter(java.lang.Class<?> subclass)
public final java.lang.Class<? super T> getRawType()
public final java.lang.reflect.Type getType()
Type
instance.final TypeLiteral<Provider<T>> providerType()
public final int hashCode()
hashCode
in class java.lang.Object
public final boolean equals(java.lang.Object o)
equals
in class java.lang.Object
public final java.lang.String toString()
toString
in class java.lang.Object
public static TypeLiteral<?> get(java.lang.reflect.Type type)
Type
instance.public static <T> TypeLiteral<T> get(java.lang.Class<T> type)
Class
instance.private java.util.List<TypeLiteral<?>> resolveAll(java.lang.reflect.Type[] types)
TypeLiteral<?> resolve(java.lang.reflect.Type toResolve)
toResolve
and returns the result.java.lang.reflect.Type resolveType(java.lang.reflect.Type toResolve)
public TypeLiteral<?> getSupertype(java.lang.Class<?> supertype)
supertype
. For example, if this is ArrayList<String>
, this returns Iterable<String>
given the input Iterable.class
.supertype
- a superclass of, or interface implemented by, this.public TypeLiteral<?> getFieldType(java.lang.reflect.Field field)
field
.field
- a field defined by this or any superclass.public java.util.List<TypeLiteral<?>> getParameterTypes(java.lang.reflect.Member methodOrConstructor)
methodOrConstructor
.methodOrConstructor
- a method or constructor defined by this or any supertype.public java.util.List<TypeLiteral<?>> getExceptionTypes(java.lang.reflect.Member methodOrConstructor)
constructor
.methodOrConstructor
- a method or constructor defined by this or any supertype.public TypeLiteral<?> getReturnType(java.lang.reflect.Method method)
method
.method
- a method defined by this or any supertype.