@Target annotation with empty set

Steve Sides steve.sides at oracle.com
Mon Mar 11 15:54:13 PDT 2013


On 3/11/2013 2:16 PM, Alex Buckley wrote:
> On 3/11/2013 1:43 PM, Jonathan Gibbons wrote:
>> Is it ever reasonable to have a @Target annotation with an empty set?
>>
>> -- Jon
>>
>>
>> import java.lang.annotation.*;
>>
>> @Target({})
>> @interface TC { T[] value();  }
>>
>> @Repeatable(TC.class)
>> @interface T { }
>>
>> @T @T
>> class C { }
>
> Reasonable? No. Legal? Yes.
>
> I allude to something like this case in a note in the rep.annos spec:
>
> "If Foo has no @Target meta-annotation but FooContainer has an @Target 
> meta-annotation, then @Foo may only be repeated on program elements 
> where @FooContainer may appear."
So, is no @Target the same as and empty @Target?

-steve

>
> That's fine, and @T should not be able to repeat anywhere.
>
> To be clear, TC is a valid containing annotation type for T, because:
>
> "T is applicable to at least the same kinds of program element as TC; 
> specifically, If the kinds of program element where T is applicable 
> are represented by the set m1, and the kinds of program element where 
> TC is applicable are represented by the set m2, then each kind in m2 
> must occur in m1 ..."
>
> m2 is the empty set so the clause holds vacuously. @T cannot repeat 
> because:
>
> "It is a compile-time error if a declaration is annotated with more 
> than one annotation of a given annotation type, unless the annotation 
> type is repeatable (§9.6), and the annotated declaration is a valid 
> target (§9.6.3.1) of both the repeatable annotation type and the 
> repeatable annotation type's containing annotation type."
>
> Alex




More information about the enhanced-metadata-spec-discuss mailing list