Class TypeResolver
- All Implemented Interfaces:
Serializable
Note that resolver instances are stateful in that resolvers cache resolved types for efficiency. Since this is internal state and not directly visible to callers, access to state is fully synchronized so that access from multiple threads is safe.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final HashMap
<ClassKey, ResolvedType> Since number of primitive types is small, and they are frequently needed, let's actually pre-create them for efficient reuse.protected final ResolvedTypeCache
Simple cache of types resolved by this resolver.private static final ResolvedType[]
private static final ResolvedObjectType
We will also need to return "unknown" type for cases where type variable binding is not found ('raw' instances of generic types); easiest way is to pre-create type forjava.lang.Object
-
Constructor Summary
ConstructorsConstructorDescriptionConstructs type cache; equivalent to:TypeResolver
(ResolvedTypeCache typeCache) Constructor that specifies type cache to use. -
Method Summary
Modifier and TypeMethodDescriptionprivate ResolvedType
_constructType
(ClassStack context, Class<?> rawType, TypeBindings typeBindings) private ResolvedType
_fromAny
(ClassStack context, Type mainType, TypeBindings typeBindings) private ResolvedType
_fromArrayType
(ClassStack context, GenericArrayType arrayType, TypeBindings typeBindings) private ResolvedType
_fromClass
(ClassStack context, Class<?> rawType, TypeBindings typeBindings) private ResolvedType
_fromGenericType
(ClassStack context, GenericType<?> generic, TypeBindings typeBindings) Factory method for resolving given generic type, defined by using sub-class instance ofGenericType
private ResolvedType
_fromParamType
(ClassStack context, ParameterizedType ptype, TypeBindings parentBindings) private ResolvedType
_fromVariable
(ClassStack context, TypeVariable<?> variable, TypeBindings typeBindings) private ResolvedType
_fromWildcard
(ClassStack context, WildcardType wildType, TypeBindings typeBindings) private ResolvedType
_resolveSuperClass
(ClassStack context, Class<?> rawType, TypeBindings typeBindings) NOTE: return type changed in 1.0.1 fromResolvedObjectType
toResolvedType
, since it was found that other types may be returned...private ResolvedType[]
_resolveSuperInterfaces
(ClassStack context, Class<?> rawType, TypeBindings typeBindings) private void
_resolveTypePlaceholders
(ResolvedType sourceType, ResolvedType actualType) Method called to verify that types match; and if there are any placeholders, replace them inactualType
.private boolean
_verifyAndResolve
(ResolvedType exp, ResolvedType act) Factory method for constructing array type of given element type.static boolean
isSelfReference
(ResolvedType type) Convenience method that can be used to checked whether given resolved type (with erased type ofjava.lang.Object
) is a placeholder for "self-reference"; these are nasty recursive ("self") types needed with some interfacesresolve
(TypeBindings typeBindings, Type jdkType) Factory method for resolving specified JavaType
, givenTypeBindings
needed to resolve any type variables.Factory method for resolving given base type using specified types as type parameters.resolveSubtype
(ResolvedType supertype, Class<?> subtype) Factory method for constructing sub-classing specified type; class specified as sub-class must be compatible according to basic Java inheritance rules (subtype must properly extend or implement specified supertype).
-
Field Details
-
NO_TYPES
-
sJavaLangObject
We will also need to return "unknown" type for cases where type variable binding is not found ('raw' instances of generic types); easiest way is to pre-create type forjava.lang.Object
-
_primitiveTypes
Since number of primitive types is small, and they are frequently needed, let's actually pre-create them for efficient reuse. Same goes for limited number of other "standard" types... -
_resolvedTypes
Simple cache of types resolved by this resolver. Caching works because type instances themselves are mostly immutable; and properly synchronized in cases where transient data (raw members) are accessed.
-
-
Constructor Details
-
TypeResolver
public TypeResolver()Constructs type cache; equivalent to:TypeResolver(ResolvedTypeCache.lruCache(200));
-
TypeResolver
Constructor that specifies type cache to use.- Parameters:
typeCache
- Cache to use for avoiding repeated resolution of already resolved types- Since:
- 1.4
-
-
Method Details
-
resolve
Factory method for resolving given base type using specified types as type parameters. Sample usage would be:ResolvedType type = TypeResolver.resolve(List.class, Integer.class);
which would be equivalent toResolvedType type = TypeResolver.resolve(new GenericType<List<Integer>>() { });
Note that you can mix different types of type parameters, whether already resolved (ResolvedType
), type-erased (Class
) or generic type reference (GenericType
). -
arrayType
Factory method for constructing array type of given element type. -
resolve
Factory method for resolving specified JavaType
, givenTypeBindings
needed to resolve any type variables.Use of this method is discouraged (use if and only if you really know what you are doing!); but if used, type bindings passed should come from
ResolvedType
instance of declaring class (or interface).NOTE: order of arguments was reversed for 0.8, to avoid problems with overload varargs method.
-
resolveSubtype
public ResolvedType resolveSubtype(ResolvedType supertype, Class<?> subtype) throws IllegalArgumentException, UnsupportedOperationException Factory method for constructing sub-classing specified type; class specified as sub-class must be compatible according to basic Java inheritance rules (subtype must properly extend or implement specified supertype).A typical use case here is to refine a generic type; for example, given that we have generic type like
List<Integer>
, but we want a more specific implementation type like classArrayList
but with same parameterization (here justInteger
), we could achieve it by:ResolvedType mapType = typeResolver.resolve(List.class, Integer.class); ResolveType concreteMapType = typeResolver.resolveSubType(mapType, ArrayList.class);
(in this case, it would have been simpler to resolve directly; but in some cases we are handled supertype and want to refine it, in which case steps would be the same but separated by other code)Note that this method will fail if extension can not succeed; either because this type is not extendable (sub-classable) -- which is true for primitive and array types -- or because given class is not a subtype of this type. To check whether subtyping could succeed, you can call
ResolvedType.canCreateSubtypes()
to see if supertype can ever be extended.- Parameters:
supertype
- Type to subtype (extend)subtype
- Type-erased sub-class or sub-interface- Returns:
- Resolved subtype
- Throws:
IllegalArgumentException
- If this type can be extended in general, but not into specified sub-classUnsupportedOperationException
- If this type can not be sub-classed
-
isSelfReference
Convenience method that can be used to checked whether given resolved type (with erased type ofjava.lang.Object
) is a placeholder for "self-reference"; these are nasty recursive ("self") types needed with some interfaces- Parameters:
type
- Type to check
-
_fromAny
-
_fromClass
-
_fromGenericType
private ResolvedType _fromGenericType(ClassStack context, GenericType<?> generic, TypeBindings typeBindings) Factory method for resolving given generic type, defined by using sub-class instance ofGenericType
-
_constructType
private ResolvedType _constructType(ClassStack context, Class<?> rawType, TypeBindings typeBindings) -
_resolveSuperInterfaces
private ResolvedType[] _resolveSuperInterfaces(ClassStack context, Class<?> rawType, TypeBindings typeBindings) -
_resolveSuperClass
private ResolvedType _resolveSuperClass(ClassStack context, Class<?> rawType, TypeBindings typeBindings) NOTE: return type changed in 1.0.1 fromResolvedObjectType
toResolvedType
, since it was found that other types may be returned...- Returns:
- Usually a
ResolvedObjectType
, but possibly alsoResolvedRecursiveType
-
_fromParamType
private ResolvedType _fromParamType(ClassStack context, ParameterizedType ptype, TypeBindings parentBindings) -
_fromArrayType
private ResolvedType _fromArrayType(ClassStack context, GenericArrayType arrayType, TypeBindings typeBindings) -
_fromWildcard
private ResolvedType _fromWildcard(ClassStack context, WildcardType wildType, TypeBindings typeBindings) -
_fromVariable
private ResolvedType _fromVariable(ClassStack context, TypeVariable<?> variable, TypeBindings typeBindings) -
_resolveTypePlaceholders
private void _resolveTypePlaceholders(ResolvedType sourceType, ResolvedType actualType) throws IllegalArgumentException Method called to verify that types match; and if there are any placeholders, replace them inactualType
.- Parameters:
sourceType
- Original base type used for specification/refinementactualType
- Base type instance after re-resolving, possibly containing type placeholders- Throws:
IllegalArgumentException
-
_verifyAndResolve
-