An annotation that may occur at most once at a given program element and only on certain program elements.

An optional annotation is declared simply by having the annotation class satisfy `OptionalAnnotation` instead of `Annotation`. For example the following would only be allowed on `class` declarations:

    final annotation class ExampleClass()
            satisfies OptionalAnnotation<Example, ClassDeclaration> {}

At runtime a `Declaration` instance can be queried for its `OptionalAnnotation`s of a certain type using `annotations()` or `optionalAnnotation()`.

See also `Annotation`

no type hierarchy

- `OptionalAnnotation`
  - `ConstrainedAnnotation`
    - `Annotation`

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

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

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