Class WildcardTypeView

    • 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.

        Specified by:
        erasure in class TypeView
        Returns:
        erasure of wrapped type
      • 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 in WildcardType.getUpperBounds(), which will return singleton array with Object 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
      • asWildcard

        @Deprecated
        public WildcardTypeView asWildcard()
        Deprecated.
        the type system already knows this is a variable, and this call does not change the type
        Try to cast wrapped type to WildcardType.

        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 class TypeView
        Returns:
        this, as this is already variable view
      • 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 class TypeView
        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.

        Specified by:
        visit in class TypeView
        Type Parameters:
        T - type returned by visitor method
        Parameters:
        visitor - method target
        Returns:
        same result as visitors method.
      • 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.

        Overrides:
        resolve in class TypeView
        Parameters:
        other - type to copy substitutions from
        Returns:
        TypeView that uses substitutions from provided type
      • 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 field protected List<T> elements. It's descendant class, declared class ExtendedExample extends Example<String> inherits field elements. In this case no conventional method will extract actual field type, List<String>:

        But this can be resolved using this method: TypeView.ofTypeOf(Example.class.getDeclaredField("elements")).resolve(ExampleExtension.class) will wrap List<String>, because variable substitution T -> String is used.
        Overrides:
        resolve in class TypeView
        Parameters:
        other - type to copy substitutions from
        Returns:
        TypeView that uses substitutions from provided type
      • unwrap

        public final T unwrap()
        Description copied from class: TypeView
        Extracts native type from this view.

        This is inverse operation from TypeView.of(Type)

        Specified by:
        unwrap in class TypeView
        Returns:
        type that this view was for
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class Object