Class TypeDescriptor<T>
- Type Parameters:
T
- the type represented by thisTypeDescriptor
- All Implemented Interfaces:
Serializable
To prevent losing actual type arguments due to erasure, create an anonymous subclass with concrete types:
TypeDescriptor<List<String>> typeDescriptor = new TypeDescriptor<List<String>>() {};
If the above were not an anonymous subclass, the type List<String>
would be erased and
unavailable at run time.
- See Also:
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
Creates aTypeDescriptor
representing the type parameterT
.protected
TypeDescriptor
(Class<?> clazz) Creates aTypeDescriptor
representing the type parameterT
, which should resolve to a concrete type in the context of the classclazz
.protected
TypeDescriptor
(Object instance) Creates aTypeDescriptor
representing the type parameterT
, which should resolve to a concrete type in the context of the classclazz
. -
Method Summary
Modifier and TypeMethodDescriptionboolean
Two type descriptor are equal if and only if they represent the same type.List
<TypeDescriptor<?>> getArgumentTypes
(Method method) Returns a list of argument types for the given method, which must be a part of the class.Returns a set ofTypeDescriptor
s, one for each superclass (including this class).Returns the component type if this type is an array type, otherwise returnsnull
.Returns a set ofTypeDescriptor
s, one for each interface implemented by this class.final TypeDescriptor
<? super T> getSupertype
(Class<? super T> superclass) Returns the generic form of a supertype.getType()
Returns theType
represented by thisTypeDescriptor
.final TypeVariable
<Class<? super T>> getTypeParameter
(String paramName) Returns aTypeVariable
for the named type parameter.getTypes()
Returns a set ofTypeDescriptor
, one for each superclass as well as each interface implemented by this class.int
hashCode()
boolean
Returns whether thisTypeDescriptor
has any unresolved type parameters, as opposed to being a concrete type.final boolean
isArray()
Returns true if this type is known to be an array type.final boolean
isSubtypeOf
(TypeDescriptor<?> parent) Return true if this type is a subtype of the given type.final boolean
isSupertypeOf
(TypeDescriptor<?> source) Returns true if this type is assignable from the given type.static <T> TypeDescriptor
<T> Returns aTypeDescriptor
representing the given type.static TypeDescriptor
<?> Returns aTypeDescriptor
representing the given type.resolveType
(Type type) Returns aTypeDescriptor
representing the given type, with type variables resolved according to the specialization in this type.toString()
A more general form ofwhere(TypeParameter, TypeDescriptor)
that returns a newTypeDescriptor
by matchingformal
againstactual
to resolve type variables in the currentTypeDescriptor
.<X> TypeDescriptor
<T> where
(TypeParameter<X> typeParameter, TypeDescriptor<X> typeDescriptor) Returns a newTypeDescriptor
where the type variable represented bytypeParameter
are substituted bytype
.
-
Constructor Details
-
TypeDescriptor
protected TypeDescriptor()Creates aTypeDescriptor
representing the type parameterT
. To use this constructor properly, the type parameter must be a concrete type, for examplenew TypeDescriptor<List<String>>(){}
. -
TypeDescriptor
Creates aTypeDescriptor
representing the type parameterT
, which should resolve to a concrete type in the context of the classclazz
.Unlike
TypeDescriptor(Class)
this will also use context's of the enclosing instances while attempting to resolve the type. This means that the types of any classes instantiated in the concrete instance should be resolvable. -
TypeDescriptor
Creates aTypeDescriptor
representing the type parameterT
, which should resolve to a concrete type in the context of the classclazz
.
-
-
Method Details
-
of
Returns aTypeDescriptor
representing the given type. -
of
Returns aTypeDescriptor
representing the given type. -
getType
Returns theType
represented by thisTypeDescriptor
. -
getRawType
-
getComponentType
Returns the component type if this type is an array type, otherwise returnsnull
. -
getSupertype
Returns the generic form of a supertype. -
isArray
public final boolean isArray()Returns true if this type is known to be an array type. -
getTypeParameter
Returns aTypeVariable
for the named type parameter. ThrowsIllegalArgumentException
if a type variable by the requested type parameter is not found.For example,
new TypeDescriptor<List>(){}.getTypeParameter("T")
returns aTypeVariable<? super List>
representing the formal type parameterT
.Do not mistake the type parameters (formal type argument list) with the actual type arguments. For example, if a class
Foo
extendsList<String>
, it does not make sense to ask for a type parameter, becauseFoo
does not have any. -
isSupertypeOf
Returns true if this type is assignable from the given type. -
isSubtypeOf
Return true if this type is a subtype of the given type. -
getArgumentTypes
Returns a list of argument types for the given method, which must be a part of the class. -
resolveType
Returns aTypeDescriptor
representing the given type, with type variables resolved according to the specialization in this type.For example, consider the following class:
class MyList implements List<String> { ... }
The
TypeDescriptor
returned by
will represent the typeTypeDescriptor.of(MyList.class) .resolveType(Mylist.class.getMethod("get", int.class).getGenericReturnType)
String
. -
getTypes
Returns a set ofTypeDescriptor
, one for each superclass as well as each interface implemented by this class. -
getInterfaces
Returns a set ofTypeDescriptor
s, one for each interface implemented by this class. -
getClasses
Returns a set ofTypeDescriptor
s, one for each superclass (including this class). -
where
public <X> TypeDescriptor<T> where(TypeParameter<X> typeParameter, TypeDescriptor<X> typeDescriptor) Returns a newTypeDescriptor
where the type variable represented bytypeParameter
are substituted bytype
. For example, it can be used to constructMap<K, V>
for anyK
andV
type:static <K, V> TypeDescriptor<Map<K, V>> mapOf( TypeDescriptor<K> keyType, TypeDescriptor<V> valueType) { return new TypeDescriptor<Map<K, V>>() {} .where(new TypeParameter<K>() {}, keyType) .where(new TypeParameter<V>() {}, valueType); }
- Type Parameters:
X
- The parameter type- Parameters:
typeParameter
- the parameter type variabletypeDescriptor
- the actual type to substitute
-
where
A more general form ofwhere(TypeParameter, TypeDescriptor)
that returns a newTypeDescriptor
by matchingformal
againstactual
to resolve type variables in the currentTypeDescriptor
. -
hasUnresolvedParameters
public boolean hasUnresolvedParameters()Returns whether thisTypeDescriptor
has any unresolved type parameters, as opposed to being a concrete type.For example:
TypeDescriptor.of(new ArrayList<String>() {}.getClass()).hasUnresolvedTypeParameters() => false, because the anonymous class is instantiated with a concrete type class TestUtils { <T> ArrayList<T> createTypeErasedList() { return new ArrayList<T>() {}; } } TypeDescriptor.of(TestUtils.<String>createTypeErasedList().getClass()) => true, because the type variable T got type-erased and the anonymous ArrayList class is instantiated with an unresolved type variable T.
-
toString
-
equals
Two type descriptor are equal if and only if they represent the same type. -
hashCode
public int hashCode()
-