package checkers.quals; import java.lang.annotation.*; /** * A meta-annotation to specify all the qualifiers that the given qualifier * is a subtype of. This provides a declarative way to specify the type * qualifier hierarchy. (Alternatively, the hierarchy can be defined * procedurally by subclassing {@link checkers.types.QualifierHierarchy} or * {@link checkers.types.TypeHierarchy}.) * * <p> * Example: * <pre> @SubtypeOf( { Nullable.class } ) * public @interface NonNull { } * </pre> * * <p> * * If a qualified type is a subtype of the same type without any qualifier, * then use <code>Unqualified.class</code> in place of a type qualifier * class. For example, to express that <code>@Encrypted <em>C</em></code> * is a subtype of <code><em>C</em></code> (for every class * <code><em>C</em></code>), and likewise for <code>@Interned</code>, write: * * <pre> @SubtypeOf(Unqualified.class) * public @interface Encrypted { } * * @SubtypeOf(Unqualified.class) * public @interface Interned { } * </pre> * * <p> * * For the root type qualifier in the qualifier hierarchy (i.e., the * qualifier that is a supertype of all other qualifiers in the given * hierarchy), use an empty set of values: * * <pre> @SubtypeOf( { } ) * public @interface Nullable { } * * @SubtypeOf( {} ) * public @interface ReadOnly { } * </pre> * * <p> * Together, all the @SubtypeOf meta-annotations fully describe the type * qualifier hierarchy. * No @SubtypeOf meta-annotation is needed on (or can be written on) the * Unqualified pseudo-qualifier, whose position in the hierarchy is * inferred from the meta-annotations on the explicit qualifiers. */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface SubtypeOf { /** An array of the supertype qualifiers of the annotated qualifier **/ Class<? extends Annotation>[] value(); }