Class TypeVariableView<D extends GenericDeclaration>

    • Field Detail

      • type

        protected final T extends Type type
    • Method Detail

      • of

        public static <D extends GenericDeclarationTypeVariableView<D> of​(TypeVariable<D> variable)
        Creates view over provided type.
        Type Parameters:
        D - element type that is declaring this variable
        Parameters:
        variable - 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 variable.

        Realizations of this variable must extend/implement all specified types.

        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.

        If variable has no upper bound, this method will return singleton collection with Object class. This is following contract in TypeVariable.getBounds(), which will return singleton array with Object class.

        Returns:
        upper bounds of this variable, wrapped in TypeView
      • asVariable

        @Deprecated
        public TypeVariableView<?> asVariable()
        Deprecated.
        the type system already knows this is a variable, and this call does not change the type
        Try to cast wrapped type to TypeVariable.

        This method is useful if you know that underlying type is Class, then this is just a casting.

        For any other type, this throws IllegalStateException, because nothing else can be converted to type variable.

        Specified by:
        asVariable 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.
      • 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