review request for 8010225 test in typeAnnotations/failures do not test TYPE_USE
Alex Buckley
alex.buckley at oracle.com
Tue Sep 17 12:29:32 PDT 2013
To all: there's a bug in case 4 below.
On 9/17/2013 12:06 PM, Steve Sides wrote:
> Got it. While whittling on this, I have another question about the
> compiler's behavior.
> 1. If I qualify the (not type) annotation,
>
> @Scopes.UniqueInner
> class Scopes<T extends @Scopes.UniqueInner Object> {
> @interface UniqueInner { };
> }
> I get 1 error, "Scopes.java:11:24:
> compiler.err.annotation.type.not.applicable". This seems correct as I'm
> using an annotation on a type usage, and the one on the class is okay.
You are right. The annotation on the upper bound of T is illegal because
the Scopes.UniqueInner annotation type is applicable only in locations
which existed in Java SE 7 (such as type declarations) and not in new
locations in Java SE 8 (such as type uses).
> 2. If I use the annotation unqualified, I get 3 errors, two for
> "cant.resolve..." and the one above again. I can see that this can also
> be correct.
>
> Scopes.java:10:2: compiler.err.cant.resolve: kindname.class,
> UniqueInner, , // on the class
> Scopes.java:11:25: compiler.err.cant.resolve: kindname.class,
> UniqueInner, , // on the bound
> Scopes.java:11:24:
> compiler.err.annotation.type.not.applicable // not a type
> annotation(I assumed)?
> 3 errors
The scope of the @interface declaration is the body of class Scopes.
Therefore, the simple name "UniqueInner" is not in scope before the { of
the declaration of Scopes. All three errors are correct.
> 3. If I use a qualified type annotation,
> @Scopes.UniqueInner
> class Scopes<T extends @Scopes.UniqueInner Object> {
> @Target(ElementType.TYPE_USE)
> @interface UniqueInner { };
> }
> it compiles without error.
As it should.
> 4. However, if I use an unqualified type annotation,
> @UniqueInner
> class Scopes<T extends @UniqueInner Object> {
> @Target(ElementType.TYPE_USE)
> @interface UniqueInner { };
> }
> I get the same 3 errors as the unqualified annotation:
>
> Scopes.java:10:2: compiler.err.cant.resolve: kindname.class, UniqueInner, ,
> Scopes.java:11:25: compiler.err.cant.resolve: kindname.class,
> UniqueInner, ,
> Scopes.java:11:24: compiler.err.annotation.type.not.applicable
> 3 errors
>
> Why should I get "compiler.err.annotation.type.not.applicable" in this
> last scenario? For 1. I kind of assumed the third error meant it was
> not applicable because it was not a type annotation. Is it not
> applicable for reasons other than not being TYPE_USE?
You are right to ponder what's going on. The third error, about
applicability, is a bug.
> I'm thinking of using it as below (and adding a postivie version with
> qualified name),
>
> @UniqueInner
> class Scopes<T extends @UniqueInner Object> {
> // Unqualified @UniqueInner is not accessible to the class .
> // One has to use @Scopes.UniqueInner.
> @Target(ElementType.TYPE_USE)
> @interface UniqueInner { };
> }
>
> but I'm unsure about that third error and would like to verify it is as
> expected.
Please add this test. The comment however should not mention
accessibility, which is a totally different concept. Say "The simple
name UniqueInner is not in scope on the header of class Scopes, so
@UniqueInner is not meaningful there. One must use the qualified name,
as in @Scopes.UniqueInner."
In addition, the type parameter T is also out of UniqueInner's scope. To
ensure that annotations on the class declaration and annotations on the
type parameter declaration are handled consistently, @UniqueInner should
be written on T as well.
Alex
More information about the type-annotations-dev
mailing list