[JSR308] Others possible syntaxes for type annotations
Eugene Kuleshov
eu at javatx.org
Mon May 21 02:33:06 EDT 2007
Igor Peshansky wrote:
> I always understood that the type parameters of a generic type are part
> of the type (i.e., List<Integer> is a different type from List<String>,
> rather than them both being constrained Lists). So it seems that whatever
> annotations you want to put on the type should follow the type parameters,
> otherwise they look like they're only constraining the base type (in my
> example, List).
>
Igor, first of all, this syntax is not even being considered by the
JSR EG just yet. Mainly because there wasn't solid argument why it would
work better then syntax currently implemented in the prototype, or
syntax that Neal Gafter recently recently proposed.
I do agree that annotations done in this way can be confusing to
someone who see them for the first time without reading the specs. In
this regard the less confusing syntax is the one implemented in the
current prototype (and at the same time that syntax has some arguable
ambiguity).
> Also, Maxim is right -- the annotations that precede type parameters with
> no separator do look like they are annotating the parameters, not the base
> type.
The reason I suggested to not use any separators for this syntax is
because it doesn't introduce any ambiguity and because annotations in
other places of the Java grammar don't have any separators. Let me give
you an example that shows that adding separator can be actually more
confusing.
Map<Integer, String, @NotNull> var = new HashMap<Integer, String>();
Now on a type declaration we have 3 parameters and right part only
have two. I think it is wrong and actually demonstrating that type
annotations are part of the concrete type, but aren't really generic
parameters. So, one of the following declarations is actually less
confusing:
Map<@NotNull Integer, String> var = new HashMap<Integer, String>();
Map<Integer, String @NotNull> var = new HashMap<Integer, String>();
Using ";" instead of "," would probably mean that annotation separator
is mandatory and you'll end up with completely unnecessary
clarifications like this:
Foo<;@NotNull> foo;
regards,
Eugene
More information about the JSR308
mailing list