[patterns-instanceof] Spec for next version of Patterns in instanceof JEP

Brian Goetz brian.goetz at oracle.com
Mon Oct 5 15:20:05 UTC 2020

Overall I really like the simplification of merging pattern variables 
into locals, just with more complex scopes.  The revised definition of 
effective finality is very natural.  This will all pay off further when 
we add pattern assignment statements.

The obvious caveat is that you have to search the entire text for "local 
variable" and consider whether you need to qualify with "that is not a 
pattern variable".  I suspect you've already done this.

In 4.12.3, the comment on DA sounds like it doesn't apply to pattern 
variables.  And strictly, it doesn't, but this would be a good place to 
mention that the scoping of a pattern variable coincides with where that 
variable would be DA.  I see this in 4.12.5 but a more general statement 
where you introduce pattern variables would be nice, even if it is a 
note rather than normative text.

5.5.  I think of `instanceof` as having two forms:

     o instanceof Type
     o instanceof Pattern

This phrasing ("converted to the type indicated by the second operand") 
is consistent with the first, but I think needs a few more words to be 
consistent with the second?  Every pattern has a "principal type" 
(making up a term); the principal type of a type pattern `T t` is `T`; 
the principal type of a deconstruction pattern `D(...)` is `D`.  (The 
definition for other kinds of patterns like constant patterns or 
declared patterns are straightforward enough to define as needed.)

(I assume the stuff on scoping and operational semantics of pattern 
matching is unchanged, so I skimmed that.)

The shadowing rules still leave room for "flow refinement" as a later 
feature, where you have a local:

     Object p;
     if (p instanceof Point p) { ... }

where the latter p is considered a type refinement of the former.  We've 
discussed this before, and it seems a reasonable feature to leave on the 
"maybe leave room for later" list, but we surely don't have to do 
anything about it now.

I have one concern:

> The second condition eliminates pointless instances of pattern 
> matching where the expression will always match the pattern. In 
> particular, the|null|literal is not compatible with any type test pattern.

I am not sure I agree with this framing.  We need to separate the 
semantics of _patterns_ from the semantics of `instanceof`. A total 
pattern (var x, Object x, total type pattern) _does_ match null.  We may 
exclude some patterns from `instanceof`, but that doesn't change their 
semantics.  I think we should get ahead of this, rather than plan on 
patching it later.

Even more so:

> The null reference value does not match any type test pattern.

According to the discussions surrounding switch, this is not true.  The 
null reference value matches any type pattern _that is total on the 
static type of the operand_.  Again, we've got to separate the semantics 
of the type pattern, from what `instanceof` does with a type pattern.  
We get several shots at null before we actually match the pattern: we 
can eliminate some matches statically at compile time, and we can 
eliminate others by giving semantics to instanceof before we ask "does 
it match the pattern."  So we should be careful in which of these three 
buckets we put our null hostility.

Overall, though, I am super-happy with how this spec has landed.  At the 
beginning, we we a bit fearful of how intrusive it would be; in the end, 
there is basically just the obvious set of new sections: pattern syntax, 
pattern scoping, pattern operational semantics.  That the diffs are 
almost entirely "adding new sections" looks like winning to me.  
Further, looking ahead, adding both new kinds of patterns (e.g., 
deconstruction patterns) and new places that use patterns (e.g., pattern 
assignment) will have an obvious place to go.

On 10/5/2020 8:53 AM, Gavin Bierman wrote:
> Dear all:
> A draft of the spec for the Patterns in instanceof feature that we plan to
> finalize in JDK 16 is now available:
> http://cr.openjdk.java.net/~gbierman/8250623/latest/
> [NB: The URL will change once we have a JEP number, and will be announced.]
> The changes are the same as those in the second preview that was released in
> Java SE 16, except for minor editorial changes and the following:
> - To lift the restriction that pattern variables are implicitly final. This
>    allows pattern variables to be considered as a strict subset of local
>    variables. A number of simplifications to the spec result from this change.
> - To make it a compile-time error for an expression of type _S_ to be matched
>    against a pattern of type _T_, where _S_ is a subtype of _T_. (This pattern
>    match will always succeed and is then pointless. The opposite case, where a
>    pattern match will always fail is already a compile-time error.)
> Comments welcome!
> Gavin

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20201005/b9b84bff/attachment.htm>

More information about the amber-spec-experts mailing list