Updated pattern match documents
Brian Goetz
brian.goetz at oracle.com
Sun Sep 9 13:03:59 UTC 2018
> Seems that the new document steps away from dedicated matching
> operator like __matches which we saw before and reuses instanceof
> instead.
Yes -- the __matches notation was always a placeholder for something,
which might have been `instanceof` all along; we just weren't sure
whether `instanceof` could be cleanly extended. But, given that it can,
this seems a pretty sensible path.
> Does this mean that sole type name like String which is used in
> instanceof currently is also a pattern?
This is possible, but we don't go quite that far in the current round;
instead, we say that instanceof can take a type or a pattern on the
RHS. (Related question, in the other direction: can a deconstruction
pattern take a binding variable for the whole thing, as in `D(int x) d`?)
> This could conflict with named constant. E. g.:
>
> class Test {
> static final int String = 5;
>
> void test(Object obj) {
> if(obj instanceof String) {
> // obj == 5 or is a string?
> }
> }
> }
>
We'd have this problem even more broadly if `T` were a pattern; is
case String:
a type pattern, or a constant pattern? At least now, we only have to
deal with this ambiguity in `instanceof`. And, it might not be
unreasonable to restrict the set of patterns you can put on the RHS of
an `instanceof`; constant patterns on the RHS of instanceof would only
be there "for completeness". So we could restrict the grammar to be:
<id> instanceof ( <type> | <type pattern> | <deconstruction pattern> )
and this problem goes away. (Saying `x instanceof 3` is kind of silly;
you could just say `x == 3`. Same for `var` and `_` patterns.) And the
result is that all these patterns are type-based, which is clearly in
the mission of `instanceof`.
If not, we have a problem where the grammar might simply accept an
identifier, and then type checking will have to do more work before we
know what the construct means. (This happens too with things like
`a.b.c`; any of those dots could be about field access, or package
membership, or nested membership; we parse it now and sort it out later,
according to some set of rules.)
More information about the amber-spec-experts
mailing list