Class WildcardTypeView
- java.lang.Object
-
- org.perfectable.introspection.type.TypeView
-
- org.perfectable.introspection.type.WildcardTypeView
-
public final class WildcardTypeView extends TypeView
TypeView
that handlesWildcardType
.
-
-
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 ArrayTypeView
asArray()
Deprecated.the type system already knows this is a wildcard type, and this call will failClassView<?>
asClass()
Deprecated.the type system already knows this is a wildcard type, and this call will failParameterizedTypeView
asParameterized()
Deprecated.the type system already knows this is a wildcard type, and this call will failTypeVariableView<?>
asVariable()
Deprecated.the type system already knows this is a wildcard type, and this call will failWildcardTypeView
asWildcard()
Deprecated.the type system already knows this is a variable, and this call does not change the typeboolean
equals(Object obj)
Class<?>
erasure()
Finds exact class that would be erasure of wrapped type.int
hashCode()
boolean
isSubTypeOf(TypeView other)
Tests if type wrapped in this view is subtype of the provided one.Collection<TypeView>
lowerBounds()
Extracts lower bounds for this wildcard.static WildcardTypeView
of(WildcardType wildcard)
Creates view over provided type.WildcardTypeView
resolve(Type other)
Create view that has variable substitutions copied from provided.WildcardTypeView
resolve(TypeView other)
Create view that has variable substitutions copied from provided.String
toString()
T
unwrap()
Extracts native type from this view.Collection<TypeView>
upperBounds()
Extracts upper bounds for this wildcard.<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 WildcardTypeView of(WildcardType wildcard)
Creates view over provided type.- Parameters:
wildcard
- 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
-
upperBounds
public Collection<TypeView> upperBounds()
Extracts upper bounds for this wildcard.In actual code, there can be only one upper bound, it is impossible to declare multiple bounds. But synthetic types can have multiple as reflection system supports it. Reflection system also supports type that has both upper and lower bounds, even in multiples.
If wildcard has no upper bound, this method will return singleton collection with
Object
class. This is following contract inWildcardType.getUpperBounds()
, which will return singleton array withObject
class.- Returns:
- upper bounds of this wildcard, wrapped in
TypeView
-
lowerBounds
public Collection<TypeView> lowerBounds()
Extracts lower bounds for this wildcard.In actual code, there can be only one lower bound, it is impossible to declare multiple bounds. But synthetic types can have multiple as reflection system supports it. Reflection system also supports type that has both upper and lower bounds, even in multiples.
If wildcard has no lower bound, this method will return empty collection. This is following contract in
WildcardType.getLowerBounds()
, which will return empty array.- Returns:
- lower bounds of this wildcard, wrapped in
TypeView
-
asParameterized
@Deprecated public ParameterizedTypeView asParameterized() throws IllegalStateException
Deprecated.the type system already knows this is a wildcard type, and this call will failAlways throwsIllegalStateException
, because it is statically provable that this instance cannot be converted to parameterized type.- Specified by:
asParameterized
in classTypeView
- Returns:
- never
- Throws:
IllegalStateException
- always
-
asClass
@Deprecated public ClassView<?> asClass() throws IllegalStateException
Deprecated.the type system already knows this is a wildcard type, and this call will failAlways throwsIllegalStateException
, because it is statically provable that this instance cannot be converted to class view.- Specified by:
asClass
in classTypeView
- Returns:
- never
- Throws:
IllegalStateException
- always
-
asVariable
@Deprecated public TypeVariableView<?> asVariable()
Deprecated.the type system already knows this is a wildcard 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()
Deprecated.the type system already knows this is a variable, and this call does not change the typeTry to cast wrapped type toWildcardType
.This method is useful if you know that underlying type is
WildcardType
, then this is just a casting.For any other type, this throws
IllegalStateException
, because nothing else can be converted to type wildcard.- Specified by:
asWildcard
in classTypeView
- Returns:
- this, as this is already variable view
-
asArray
@Deprecated public ArrayTypeView asArray() throws IllegalStateException
Deprecated.the type system already knows this is a wildcard type, and this call will failAlways throwsIllegalStateException
, because it is statically provable that this instance cannot be converted to array type.- Specified by:
asArray
in classTypeView
- Returns:
- never
- Throws:
IllegalStateException
- always
-
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 WildcardTypeView 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 WildcardTypeView 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)
-
-