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.
| Modifier and Type | Field and Description |
|---|---|
| protected static final HashMap | _primitiveTypes
Since number of primitive types is small, and they are frequently needed, let's actually pre-create them for efficient reuse. |
| protected final ResolvedTypeCache | _resolvedTypes
Simple cache of types resolved by this resolver. |
| private static final ResolvedType[] | |
| private static final ResolvedObjectType | 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 for |
| Access | Constructor and Description |
|---|---|
| public | |
| public | TypeResolver(ResolvedTypeCache
Cache to use for avoiding repeated resolution of already resolved
types typeCache)Constructor that specifies type cache to use. |
| Modifier and Type | Method and Description |
|---|---|
| private ResolvedType | |
| private ResolvedType | |
| private ResolvedType | |
| private ResolvedType | |
| private ResolvedType | _fromGenericType(ClassStack context, GenericType<?> generic, TypeBindings typeBindings)
Factory method for resolving given generic type, defined by using sub-class
instance of |
| private ResolvedType | |
| private ResolvedType | |
| private ResolvedType | |
| private ResolvedType | _resolveSuperClass(ClassStack context, Class<?> rawType, TypeBindings typeBindings)
Note return type changed in 1.0.1 from |
| private ResolvedType[] | |
| private void | _resolveTypePlaceholders(ResolvedType
Original base type used for specification/refinement sourceType, ResolvedType Base type instance after re-resolving, possibly containing type placeholders actualType)Method called to verify that types match; and if there are any placeholders,
replace them in |
| private boolean | |
| public ResolvedArrayType | |
| public static boolean | isSelfReference(ResolvedType
Type to check type)Convenience method that can be used to checked whether given resolved type
(with erased type of |
| public ResolvedType | |
| public ResolvedType | resolve(TypeBindings typeBindings, Type jdkType)
Factory method for resolving specified Java |
| public ResolvedType | Returns: Resolved subtypeType to subtype (extend) supertype, final Class<?> Type-erased sub-class or sub-interface 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). |
| _primitiveTypes | back to summary |
|---|---|
| protected static final HashMap<ClassKey, ResolvedType> _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 | back to summary |
|---|---|
| protected final ResolvedTypeCache _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. | |
| NO_TYPES | back to summary |
|---|---|
| private static final ResolvedType[] NO_TYPES | |
| sJavaLangObject | back to summary |
|---|---|
| private static final ResolvedObjectType 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 for | |
| TypeResolver | back to summary |
|---|---|
| public TypeResolver() Constructs type cache; equivalent to: TypeResolver(ResolvedTypeCache.lruCache(200)); | |
| TypeResolver | back to summary |
|---|---|
| public TypeResolver(ResolvedTypeCache typeCache) Constructor that specifies type cache to use.
| |
| _constructType | back to summary |
|---|---|
| private ResolvedType _constructType(ClassStack context, Class<?> rawType, TypeBindings typeBindings) | |
| _fromAny | back to summary |
|---|---|
| private ResolvedType _fromAny(ClassStack context, Type mainType, TypeBindings typeBindings) | |
| _fromArrayType | back to summary |
|---|---|
| private ResolvedType _fromArrayType(ClassStack context, GenericArrayType arrayType, TypeBindings typeBindings) | |
| _fromClass | back to summary |
|---|---|
| private ResolvedType _fromClass(ClassStack context, Class<?> rawType, TypeBindings typeBindings) | |
| _fromGenericType | back to summary |
|---|---|
| private ResolvedType _fromGenericType(ClassStack context, GenericType<?> generic, TypeBindings typeBindings) Factory method for resolving given generic type, defined by using sub-class
instance of | |
| _fromParamType | back to summary |
|---|---|
| private ResolvedType _fromParamType(ClassStack context, ParameterizedType ptype, TypeBindings parentBindings) | |
| _fromVariable | back to summary |
|---|---|
| private ResolvedType _fromVariable(ClassStack context, TypeVariable<?> variable, TypeBindings typeBindings) | |
| _fromWildcard | back to summary |
|---|---|
| private ResolvedType _fromWildcard(ClassStack context, WildcardType wildType, TypeBindings typeBindings) | |
| _resolveSuperClass | back to summary |
|---|---|
| private ResolvedType _resolveSuperClass(ClassStack context, Class<?> rawType, TypeBindings typeBindings) Note return type changed in 1.0.1 from
| |
| _resolveSuperInterfaces | back to summary |
|---|---|
| private ResolvedType[] _resolveSuperInterfaces(ClassStack context, Class<?> rawType, TypeBindings typeBindings) | |
| _resolveTypePlaceholders | back to summary |
|---|---|
| private void _resolveTypePlaceholders(ResolvedType sourceType, ResolvedType actualType) throws IllegalArgumentException Method called to verify that types match; and if there are any placeholders,
replace them in
| |
| _verifyAndResolve | back to summary |
|---|---|
| private boolean _verifyAndResolve(ResolvedType exp, ResolvedType act) | |
| arrayType | back to summary |
|---|---|
| public ResolvedArrayType arrayType(Type elementType) Factory method for constructing array type of given element type. | |
| isSelfReference | back to summary |
|---|---|
| public static boolean isSelfReference(ResolvedType type) Convenience method that can be used to checked whether given resolved type
(with erased type of
| |
| resolve | back to summary |
|---|---|
| public ResolvedType resolve(Type type, Type... typeParameters) 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 to
ResolvedType type = TypeResolver.resolve(new GenericType<List<Integer>>() { });
Note that you can mix different types of type parameters, whether already
resolved (ResolvedType), type-erased (java.) or
generic type reference (GenericType).
| |
| resolve | back to summary |
|---|---|
| public ResolvedType resolve(TypeBindings typeBindings, Type jdkType) Factory method for resolving specified Java
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 Note order of arguments was reversed for 0.8, to avoid problems with overload varargs method. | |
| resolveSubtype | back to summary |
|---|---|
| public ResolvedType resolveSubtype(ResolvedType supertype, final 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 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
| |