java.lang.Object
org.checkerframework.framework.util.typeinference8.types.AbstractType
Direct Known Subclasses:
InferenceType, ProperType, UseOfVariable

public abstract class AbstractType extends Object
This class represents "types" that "include type-like syntax that contains inference variables" (see JLS section 18.1.1). Three subclasses of this class are:
  • ProperType: types that do not contain inference variables
  • Variable: inference variables
  • InferenceType: type-like syntax that contains at least one inference variable
  • Field Details

    • context

      protected final Java8InferenceContext context
      The context object.
    • typeFactory

      protected final AnnotatedTypeFactory typeFactory
    • ignoreAnnotations

      public final boolean ignoreAnnotations
      True if the annotations on this type should be ignored.

      This field applies to every qualifier hierarchy at once, even when it was set because of a primary annotation that appears in only some of the hierarchies. TODO: Make this per-hierarchy, so that the hierarchies without such a primary annotation are still compared.

    • functionType

      If this AbstractType is a functional interface type, then functionType is its function type. Otherwise, functionType is null. Initialized by getFunctionType().
  • Constructor Details

    • AbstractType

      protected AbstractType(Java8InferenceContext context, boolean ignoreAnnotations)
      Creates an AbstractType.
      Parameters:
      context - the context object
      ignoreAnnotations - true if the annotations on this type should be ignored
  • Method Details

    • getKind

      public abstract AbstractType.Kind getKind()
      Returns the kind of AbstractType.
      Returns:
      the kind of AbstractType
    • isProper

      public boolean isProper()
      Returns true if this type is a proper type.
      Returns:
      true if this type is a proper type
    • isUseOfVariable

      public boolean isUseOfVariable()
      Returns true if this type is a use of an inference variable.
      Returns:
      true if this type is a use of an inference variable
    • isInferenceType

      public boolean isInferenceType()
      Returns true if this type contains inference variables, but is not an inference variable.
      Returns:
      true if this type contains inference variables, but is not an inference variable
    • getTypeKind

      public final TypeKind getTypeKind()
      Returns the TypeKind of the underlying Java type.
      Returns:
      the TypeKind of the underlying Java type
    • create

      public abstract AbstractType create(AnnotatedTypeMirror atm, boolean ignoreAnnotations)
      Creates a type using the given types.
      Parameters:
      atm - annotated type mirror
      ignoreAnnotations - true if the annotations on this type should be ignored
      Returns:
      the new type
    • create

      public final List<AbstractType> create(Collection<? extends AnnotatedTypeMirror> atms, boolean ignoreAnnotations)
      Creates types using the given types.
      Parameters:
      atms - annotated type mirrors
      ignoreAnnotations - true if the annotations on this type should be ignored
      Returns:
      the new types
    • getJavaType

      public abstract TypeMirror getJavaType()
      Returns the underlying Java type without inference variables.
      Returns:
      the underlying Java type without inference variables
    • getAnnotatedType

      public abstract AnnotatedTypeMirror getAnnotatedType()
      Returns the underlying annotated type.
      Returns:
      the underlying annotated type
    • getInferenceVariables

      public abstract Collection<Variable> getInferenceVariables()
      Returns a collection of all inference variables referenced by this type.
      Returns:
      a collection of all inference variables referenced by this type
    • applyInstantiations

      public abstract AbstractType applyInstantiations()
      Returns a new type that is the same as this one except the variables in instantiations have been replaced by their instantiation.
      Returns:
      a new type that is the same as this one except the variables in instantiations have been replaced by their instantiation
    • isObject

      public abstract boolean isObject()
      Returns true if this type is java.lang.Object.
      Returns:
      true if this type is java.lang.Object
    • getTypeParameterBounds

      public @Nullable List<ProperType> getTypeParameterBounds()
      Assuming the type is a declared type, this method returns the upper bounds of its type parameters. (A type parameter of a declared type, can't refer to any type being inferred, so they are proper types.)

      This implementation always returns a list. The return type is @Nullable only because UseOfVariable.getTypeParameterBounds() returns null.

      Returns:
      the upper bounds of the type parameters of this type
    • capture

      public AbstractType capture(Java8InferenceContext context)
      Returns a new type that is the capture of this type.
      Parameters:
      context - the context object
      Returns:
      a new type that is the capture of this type
    • asSuper

      public @Nullable AbstractType asSuper(TypeMirror superType)
      If superType is a super type of this type, then this method returns the super type of this type that is the same class as superType. Otherwise, it returns null
      Parameters:
      superType - a type, need not be a super type of this type
      Returns:
      super type of this type that is the same class as superType or null if one doesn't exist
    • isFunctionalInterface

      public boolean isFunctionalInterface()
      Returns true if this AbstractType is a functional interface type.
      Returns:
      true if this AbstractType is a functional interface type
    • getFunctionTypeReturnType

      public @Nullable AbstractType getFunctionTypeReturnType()
      If this type is a functional interface whose function type has a non-void return type, then this method returns that return type. Otherwise, returns null.

      Note that a null result does not distinguish between the two reasons for it: this type is not a functional interface, or the return type of its function type is void.

      Returns:
      the return type of the function type of this type, or null if this type is not a functional interface or its function type returns void
    • getFunctionTypeParameterTypes

      public @Nullable List<AbstractType> getFunctionTypeParameterTypes()
      If this type is a functional interface, then this method returns the parameter types of the function type of that functional interface. Otherwise, it returns null.

      Each call returns a new list, which the caller may modify.

      Returns:
      the parameter types of the function type of this type or null if no function type exists
    • isRaw

      public boolean isRaw()
      Returns true if the type is a raw type.
      Returns:
      true if the type is a raw type
    • replaceTypeArgs

      public AbstractType replaceTypeArgs(List<AbstractType> args)
      Returns a new type that is the same type as this one, but whose type arguments are args.
      Parameters:
      args - a list of type arguments
      Returns:
      a new type that is the same type as this one, but whose type arguments are args
    • isParameterizedType

      public boolean isParameterizedType()
      Returns true if this type is a parameterized class or interface type, an inner class type of a parameterized class or interface type (directly or indirectly), or a raw type.
      Returns:
      true if this type is a parameterized type or a raw type
    • getMostSpecificArrayType

      public @Nullable AbstractType getMostSpecificArrayType()
      Returns the most specific array type that is a super type of this type or null if one doesn't exist.
      Returns:
      the most specific array type that is a super type of this type or null if one doesn't exist
    • isPrimitiveArray

      public boolean isPrimitiveArray()
      Returns true if this type is a primitive array.
      Returns:
      true if this type is a primitive array
    • getIntersectionBounds

      public List<AbstractType> getIntersectionBounds()
      Returns assuming type is an intersection type, this method returns the bounds in this type.
      Returns:
      assuming type is an intersection type, this method returns the bounds in this type
    • getTypeVarUpperBound

      public AbstractType getTypeVarUpperBound()
      Returns assuming this type is a type variable, this method returns the upper bound of this type.
      Returns:
      assuming this type is a type variable, this method returns the upper bound of this type
    • getTypeVarLowerBound

      public AbstractType getTypeVarLowerBound()
      Returns assuming this type is a type variable that has a lower bound, this method returns the lower bound of this type.
      Returns:
      assuming this type is a type variable that has a lower bound, this method returns the lower bound of this type
    • isLowerBoundTypeVariable

      public boolean isLowerBoundTypeVariable()
      Returns true if this type is a type variable with a lower bound.
      Returns:
      true if this type is a type variable with a lower bound
    • isWildcardParameterizedType

      public boolean isWildcardParameterizedType()
      Returns true if this type is a parameterized type that has at least one wildcard as a type argument.
      Returns:
      true if this type is a parameterized type that has at least one wildcard as a type argument
    • getTypeArguments

      public @Nullable List<AbstractType> getTypeArguments()
      Returns this type's type arguments or null if this type isn't a declared type. For an inner class type such as Outer<String>.Inner, the result does not include the type arguments of the enclosing type; use getEnclosingType() to reach those.
      Returns:
      this type's type arguments or null if this type isn't a declared type
    • getEnclosingType

      public @Nullable AbstractType getEnclosingType()
      Returns this type's enclosing type, or null if this type is not an inner class type. (A static nested class type has no enclosing type, in the sense of JLS 4.5.)

      The type arguments of an inner class type do not include those of its enclosing type, so a client that reasons about all the type arguments that a type mentions -- as JLS 18.2.3 and 18.2.4 do -- must recurse through this method as well as through getTypeArguments().

      Returns:
      this type's enclosing type, or null if this type is not an inner class type
    • isUnboundWildcard

      public boolean isUnboundWildcard()
      Returns true if the type is an unbound wildcard.
      Returns:
      true if the type is an unbound wildcard
    • isUpperBoundedWildcard

      public boolean isUpperBoundedWildcard()
      Returns true if the type is a wildcard with an upper bound.
      Returns:
      true if the type is a wildcard with an upper bound
    • isLowerBoundedWildcard

      public boolean isLowerBoundedWildcard()
      Returns true if the type is a wildcard with a lower bound.
      Returns:
      true if the type is a wildcard with a lower bound
    • getWildcardLowerBound

      public @Nullable AbstractType getWildcardLowerBound()
      If this type is a wildcard, returns its lower bound; otherwise, returns null.
      Returns:
      the lower bound of this wildcard type, or null if this type is not a wildcard
    • getWildcardUpperBound

      public @Nullable AbstractType getWildcardUpperBound()
      If this type is a wildcard, returns its upper bound; otherwise, returns null. If the wildcard has no explicit upper bound, the returned type is the upper bound of the type variable to which the wildcard is bound; see AnnotatedTypeMirror.AnnotatedWildcardType.getExtendsBound().
      Returns:
      the upper bound of this wildcard type, or null if this type is not a wildcard
    • getErased

      public AbstractType getErased()
      Returns new type whose Java type is the erasure of this type.
      Returns:
      a new type whose Java type is the erasure of this type
    • getComponentType

      public final @Nullable AbstractType getComponentType()
      Returns the array component type of this type or null if one does not exist.
      Returns:
      the array component type of this type or null if one does not exist
    • getQualifiers

      public abstract Set<AbstractQualifier> getQualifiers()
      Returns the primary qualifiers on this type.
      Returns:
      the primary qualifiers on this type
    • checkAnnotationSubtype

      protected final ConstraintSet checkAnnotationSubtype(ProperType superType)
      Checks whether the annotations of this are a subtype of those of superType, assuming that their underlying Java types have already been found to be in the required relationship. If either type is marked as having annotations that should be ignored, then the annotations are not compared.
      Parameters:
      superType - the potential supertype
      Returns:
      ConstraintSet.TRUE if the annotations are ignored or if the annotations of this are a subtype of those of superType; otherwise ConstraintSet.TRUE_ANNO_FAIL
    • equals

      public abstract boolean equals(Object o)
      Overrides:
      equals in class Object
    • hashCode

      public abstract int hashCode()
      Overrides:
      hashCode in class Object
    • sameInferenceProblem

      protected final boolean sameInferenceProblem(AbstractType that)
      Returns true if that belongs to the same inference problem as this type and treats annotations the same way as this type does. This is a helper method for equals(java.lang.Object); it says nothing about the types themselves.
      Parameters:
      that - another abstract type
      Returns:
      true if that belongs to the same inference problem as this type and treats annotations the same way as this type does
    • inferenceProblemHashCode

      protected final int inferenceProblemHashCode()
      Returns a hash code for the fields that sameInferenceProblem(org.checkerframework.framework.util.typeinference8.types.AbstractType) compares. This is a helper method for hashCode().
      Returns:
      a hash code for the fields that sameInferenceProblem(org.checkerframework.framework.util.typeinference8.types.AbstractType) compares