Class TypeVariableReference

java.lang.Object
org.jboss.jandex.Type
org.jboss.jandex.TypeVariableReference
All Implemented Interfaces:
Descriptor

public final class TypeVariableReference extends Type
Represents a reference to a type variable in the bound of a recursive type parameter. For example, if a class or method declares a type parameter T extends Comparable<T>, then the second occurence of T is represented as a type variable reference and not as a type variable, because it occurs in its own definition. A type variable which is fully defined before its occurence in a recursive type parameter is still represented as a type variable. For example, the recursive type parameter in the following class includes one type variable reference:
 abstract class Builder<T, THIS extends Builder<T, THIS>> {
     abstract T build();

     final THIS self() {
         return (THIS) this;
     }
 }
 
The identifier of the reference is THIS. The occurence of type variable T in the recursive type parameter is not represented as a reference, because it does not occur in its own definition. It is fully defined before.

The same holds for mutually recursive type parameters. If a type variable is fully defined before the type parameter in whose bound it occurs, it is represented as a type variable. It is represented as a type variable reference if it is defined after the type parameter in whose bound it occurs.

The type variable reference may be followed to obtain the original type variable.

Note that a type variable and a reference to that type variable may have different type annotations. Type annotations on the reference may be looked up from the reference, but when the reference is followed, the result is the original type variable with its own type annotations.

  • Field Details

    • name

      private final String name
    • target

      private TypeVariable target
    • internalClassName

      private final DotName internalClassName
  • Constructor Details

  • Method Details

    • name

      public DotName name()
      Description copied from class: Type
      Returns the name of this type (or its erasure in case of generic types) as a DotName, using the Class.getName() format. Specifically:
      • for primitive types and the void pseudo-type, the corresponding Java keyword is returned (void, boolean, byte, short, int, long, float, double, char);
      • for class types, the binary name of the class is returned;
      • for array types, a string is returned that consists of one or more [ characters corresponding to the number of dimensions of the array type, followed by the element type as a single-character code for primitive types or Lbinary.name.of.TheClass; for class types (for example, [I for int[] or [[Ljava.lang.String; for String[][]);
      • for parameterized types, the binary name of the generic class is returned (for example, java.util.List for List<String>);
      • for type variables, the name of the first bound of the type variable is returned, or java.lang.Object for type variables that have no bound;
      • for wildcard types, the name of the upper bound is returned, or java.lang.Object if the wildcard type does not have an upper bound (for example, java.lang.Number for ? extends Number).
      Overrides:
      name in class Type
      Returns:
      the name of this type (or its erasure in case of generic types)
    • identifier

      public String identifier()
      Returns the identifier of this type variable reference as it appears in Java source code.

      For example, the following class has a recursive type parameter E with one reference:

       abstract class MyEnum<E extends MyEnum<E>> {
       }
       
      The identifier of the reference is E.
      Returns:
      the identifier of this type variable reference
    • follow

      public TypeVariable follow()
      Returns the type variable referred to by this reference.
    • internalClassName

      DotName internalClassName()
    • kind

      public Type.Kind kind()
      Description copied from class: Type
      Returns the kind of Type this is.
      Specified by:
      kind in class Type
      Returns:
      the kind
    • asTypeVariableReference

      public TypeVariableReference asTypeVariableReference()
      Description copied from class: Type
      Casts this type to a TypeVariableReference and returns it if the kind is Type.Kind.TYPE_VARIABLE_REFERENCE. Throws an exception otherwise.
      Overrides:
      asTypeVariableReference in class Type
      Returns:
      a TypeVariableReference
    • copyType

      Type copyType(AnnotationInstance[] newAnnotations)
      Specified by:
      copyType in class Type
    • setTarget

      void setTarget(TypeVariable target)
    • toString

      String toString(boolean simple)
      Overrides:
      toString in class Type
    • equals

      public boolean equals(Object o)
      Description copied from class: Type
      Compares this Type with another type. A type is equal to another type if it is of the same kind, and all of their fields are equal. This includes annotations, which must be equal as well.
      Overrides:
      equals in class Type
      Parameters:
      o - the type to compare to
      Returns:
      true if equal
      See Also:
    • hashCode

      public int hashCode()
      Description copied from class: Type
      Computes a hash code representing this type.
      Overrides:
      hashCode in class Type
      Returns:
      the hash code
    • internEquals

      boolean internEquals(Object o)
      Overrides:
      internEquals in class Type
    • internHashCode

      int internHashCode()
      Overrides:
      internHashCode in class Type