Class ParameterizedTypeView
- java.lang.Object
-
- org.perfectable.introspection.type.TypeView
-
- org.perfectable.introspection.type.ParameterizedTypeView
-
public final class ParameterizedTypeView extends TypeView
TypeView
that handlesParameterizedType
.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.perfectable.introspection.type.TypeView
TypeView.PartialVisitor<T>, TypeView.Visitor<T>
-
-
Field Summary
Fields Modifier and Type Field Description protected T
type
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description List<TypeView>
arguments()
Calculates types used as arguments for this parameterized type.ArrayTypeView
asArray()
Try to cast/convert wrapped type toGenericArrayType
.ClassView<?>
asClass()
Try to cast or convert wrapped type toClass
.ParameterizedTypeView
asParameterized()
Deprecated.the type system already knows this is a parameterized type, and this call does not change the typeTypeVariableView<?>
asVariable()
Deprecated.the type system already knows this is a parameterized type, and this call will failWildcardTypeView
asWildcard()
Deprecated.the type system already knows this is a parameterized type, and this call will failboolean
equals(Object obj)
Class<?>
erasure()
Finds exact class that would be erasure of wrapped type.int
hashCode()
List<ParameterizedTypeView>
interfaces()
Extracts list of interfaces either extended or implemented by this type.boolean
isSubTypeOf(TypeView other)
Tests if type wrapped in this view is subtype of the provided one.static ParameterizedTypeView
of(ParameterizedType parameterized)
Creates view over provided type.ParameterizedTypeView
resolve(Type other)
Create view that has variable substitutions copied from provided.ParameterizedTypeView
resolve(TypeView other)
Create view that has variable substitutions copied from provided.Optional<ParameterizedTypeView>
superclass()
Extracts superclass as a type view.String
toString()
T
unwrap()
Extracts native type from this view.<T> T
visit(TypeView.Visitor<T> visitor)
Visitor patter method dispatching method.-
Methods inherited from class org.perfectable.introspection.type.TypeView
isInstance, isProperSubtypeOf, isProperSubtypeOf, isProperSupertypeOf, isProperSupertypeOf, isSubTypeOf, isSuperTypeOf, isSuperTypeOf, of, of, of, of, of, ofParameterOf, ofTypeOf, ofTypeParameterOf
-
-
-
-
Field Detail
-
type
protected final T extends Type type
-
-
Method Detail
-
of
public static ParameterizedTypeView of(ParameterizedType parameterized)
Creates view over provided type.- Parameters:
parameterized
- construct to wrap- Returns:
- view wrapping specified type
-
erasure
public Class<?> erasure()
Description copied from class:TypeView
Finds exact class that would be erasure of wrapped type.This method is implemented according to JSL section 4.6 with following extensions:
- Erasure of wildcard type is erasure of its leftmost upper bound,
or
Object
if there isn't one
These extensions are needed, because these types are cannot be used in declaration, but can be obtained by reflections.
- Erasure of wildcard type is erasure of its leftmost upper bound,
or
-
arguments
public List<TypeView> arguments()
Calculates types used as arguments for this parameterized type.In other words, this method returns list of types that were used in place of type variables in declaration of this type. For example, if wrapped type is
Map<Integer, ? extends String[]>
then this method will return a list with two elements containing type view wrapping of class and type view wrapping of wildcard type with array class as a upper bound.This method creates corrected arguments: if raw type that this parameterized type is based on declared one of its variable to have upper bound, and in type argument substitution there were additional bounds declared, corrected argument will have both bounds. Ex. if raw type was a class with declaration
class Example<T extends Serializable> {...}
and this was used as fieldprivate Example<? super String> field;
, then this method will return wildcard with both bounds:? extends Serializable super String
.- Returns:
- types used as arguments for this parameterized type.
-
superclass
public Optional<ParameterizedTypeView> superclass()
Extracts superclass as a type view.- Returns:
- superclass wrapped in
TypeView
, empty if this class has no superclass
-
interfaces
public List<ParameterizedTypeView> interfaces()
Extracts list of interfaces either extended or implemented by this type.- Returns:
- interfaces wrapped in
TypeView
-
asParameterized
@Deprecated public ParameterizedTypeView asParameterized()
Deprecated.the type system already knows this is a parameterized type, and this call does not change the typeTry to cast or convert wrapped type toParameterizedType
.This method is useful if you know that underlying type is
ParameterizedType
, then this is just a casting.This can also be done for regular classes,
ClassView
, as non-generic class can be treated as generic class with zero type parameters. It also works for class-represented arrays that are currently converted to parameterized types.- Specified by:
asParameterized
in classTypeView
- Returns:
- this, as this is already parameterized view
-
asClass
public ClassView<?> asClass() throws IllegalStateException
Try to cast or convert wrapped type toClass
.This method is useful if you know that underlying type is
Class
, then this is just a casting.This can also be done for parameterized types with no actual substitutions and array classes represented by
ArrayTypeView
This method only works if this type has no actual substitutions and its base type is a class.
- Specified by:
asClass
in classTypeView
- Returns:
- class view with class equivalent to this unparameterized type
- Throws:
IllegalStateException
- when this view cannot be converted to Class.
-
asVariable
@Deprecated public TypeVariableView<?> asVariable() throws IllegalStateException
Deprecated.the type system already knows this is a parameterized type, and this call will failAlways throwsIllegalStateException
, because it is statically provable that this instance cannot be converted to type variable.- Specified by:
asVariable
in classTypeView
- Returns:
- never
- Throws:
IllegalStateException
- always
-
asWildcard
@Deprecated public WildcardTypeView asWildcard() throws IllegalStateException
Deprecated.the type system already knows this is a parameterized type, and this call will failAlways throwsIllegalStateException
, because it is statically provable that this instance cannot be converted to wildcard type.- Specified by:
asWildcard
in classTypeView
- Returns:
- never
- Throws:
IllegalStateException
- always
-
asArray
public ArrayTypeView asArray() throws IllegalStateException
Try to cast/convert wrapped type toGenericArrayType
.This method is useful if you know that underlying type is
GenericArrayType
, then this is just a casting.This can also be done for parameterized types with no actual substitutions that represetn array class, and class view that has array class.
This method only works if this type has no actual substitutions and its base type is an array class.
- Specified by:
asArray
in classTypeView
- Returns:
- class view with array class equivalent to this unparameterized type
- Throws:
IllegalStateException
- when this view cannot be converted to view of GenericArrayType.
-
isSubTypeOf
public boolean isSubTypeOf(TypeView other)
Description copied from class:TypeView
Tests if type wrapped in this view is subtype of the provided one.This method tries to adhere to the spirit of subtyping: it answers the question: Having reference of type T, can value of type S be always assigned to it?
Subtyping is precisely defined for types that can be declared in source, but there are more types that can be constructed or extracted via reflections. This method follows JLS section 4.10 for every aspect it declares, but also defines sensible rule for subtyping wildcards: wildcard is a supertype of its lower bounds, i.e.
? super CharStream
is supertype of CharStream and- Specified by:
isSubTypeOf
in classTypeView
- Parameters:
other
- type to test subtype relation against- Returns:
- true if this type is subtype of provided argument
-
visit
public <T> T visit(TypeView.Visitor<T> visitor)
Description copied from class:TypeView
Visitor patter method dispatching method.This method calls specific method on provided
visitor
, depending on actual implementation of this type.It will return whatever the method returns.
-
resolve
public ParameterizedTypeView resolve(Type other)
Description copied from class:TypeView
Create view that has variable substitutions copied from provided.See documentation on
TypeView.resolve(TypeView)
for details.
-
resolve
public ParameterizedTypeView resolve(TypeView other)
Description copied from class:TypeView
Create view that has variable substitutions copied from provided.This method creates type that has any variable substituted by substitutions used in
other
.Substitutions are found recursively. They can be only directly found in parameterized types, as arguments, but these parameterized types can be found in components of some containing type. For example, wildcard might use parameterized type as a bound, and this parameterized type might have substitution for specific variable.
This method can be used to find what the signature of field or method looks like in some specific type. For example: lets say that there's a generic class
class Example<T>
that declares fieldprotected List<T> elements
. It's descendant class, declaredclass ExtendedExample extends Example<String>
inherits fieldelements
. In this case no conventional method will extract actual field type,List<String>
:- Field found by
Class.getDeclaredField(java.lang.String)
called onExampleExtension
will return null, as this field is not declared there. - Field found by
Class.getDeclaredField(java.lang.String)
called onExample
(orClass.getField(java.lang.String)
on child class, if the field would be public) will return field from parent class, executingField.getGenericType()
on it will returnList<T>
TypeView.ofTypeOf(Example.class.getDeclaredField("elements")).resolve(ExampleExtension.class)
will wrapList<String>
, because variable substitutionT
->String
is used. - Field found by
-
unwrap
public final T unwrap()
Description copied from class:TypeView
Extracts native type from this view.This is inverse operation from
TypeView.of(Type)
-
-