[External] : Re: Is a TYPE_USE annotation stored as such in a class file?

Alex Buckley alex.buckley at oracle.com
Thu Feb 16 23:01:46 UTC 2023


On 2/16/2023 2:46 PM, Laird Nelson wrote:
> On Thu, Feb 16, 2023 at 2:43 PM Alex Buckley <alex.buckley at oracle.com 
> <mailto:alex.buckley at oracle.com>> wrote:
> 
>     The annotation interface A has ElementType.TYPE_USE === applicable in
>     type contexts (9.6.4.1).
> 
> If you have the time and for my own learning: which of the 17 type 
> contexts in 4.11 
> (https://docs.oracle.com/javase/specs/jls/se19/html/jls-4.html#jls-4.11 
> <https://docs.oracle.com/javase/specs/jls/se19/html/jls-4.html#jls-4.11>) is:
> 
> class B
> 
> ...such that @A is applicable in it?

The declaration `class B {}` is not a type context.

Here is the annotation `@A` being applied in some type contexts:

   class B extends    @A Foo {}
   class B implements @A Bar {}
   class B<@A T extends @A Number> {}

These applications of `@A` are legal -- they are _type annotations_ -- 
because they're applying to types (a.k.a. type uses -- of Foo, Bar, T, 
Number) and the annotation interface `A` is applicable in type contexts.

In contrast, you are applying `@A` to a declaration, `class B {}`. Your 
application of `@A` is legal - it is a _declaration annotation_ -- because:

   A declaration annotation is ... an annotation that applies to a class,
   interface, or type parameter declaration, and whose annotation
   interface is applicable in type contexts (§4.11).

That is, `A` being applicable in type contexts means `@A` can be applied 
very, very widely.

Alex


More information about the compiler-dev mailing list