An annotation constrained to appear only on certain program elements, and only with certain values.

This interface should never be satisfied directly by any annotation type. Instead, either `OptionalAnnotation` or `SequencedAnnotation` should be satisfied by the annotation type.

The type parameters encode information about the annotation type and its constraints:

- `Value` represents the type of the annotation itself,
- `ProgramElement` represents a constraint on the
  reference expression type of the annotated program element, for example, `ClassDeclaration` or `Module`, where `Annotated` means there is no constraint, and
- `Type` is a constraint on the metamodel type of the annotated program element, for example, `Function<Float,[Float,Float]>` (`ceylon.language.meta.model::Function`), where `Anything` means there is no constraint, and that the program element need not have a metamodel type.

See also `Annotation`, `OptionalAnnotation`, `SequencedAnnotation`

no type hierarchy

- `ConstrainedAnnotation`
  - `Annotation`

- `ConstrainedAnnotation` of
  - `OptionalAnnotation`
    - `AbstractAnnotation`
    - `ActualAnnotation`
    - `AliasesAnnotation`
    - `AnnotationAnnotation`
    - `AuthorsAnnotation`
    - `DefaultAnnotation`
    - `DeprecationAnnotation`
    - `DocAnnotation`
    - `FinalAnnotation`
    - `FormalAnnotation`
    - `LateAnnotation`
    - `LicenseAnnotation`
    - `NativeAnnotation`
    - `OptionalImportAnnotation`
    - `SealedAnnotation`
    - `SerializableAnnotation`
    - `SharedAnnotation`
    - `SuppressWarningsAnnotation`
    - `TagsAnnotation`
    - `VariableAnnotation`
  - `SequencedAnnotation`
    - `SeeAnnotation`
    - `ThrownExceptionAnnotation`

Inherited Attributes
Attributes inherited from: `Object` `hash`, `string`

Inherited Methods
Methods inherited from: `Object` `equals()`