What does instanceof mean (was: Primitives in instanceof and patterns)

Brian Goetz brian.goetz at oracle.com
Fri Sep 9 20:06:34 UTC 2022


As mentioned, it is a common mental model that "Instanceof is the 
subtype operator", as Remi claims here:

On 9/9/2022 11:35 AM, Remi Forax wrote:
> And i'm still worry that we are muddying the water here, instanceof is 
> about instance and subtypining relationship (hence the name)

We will surely elicit some "who moved my cheese" responses when 
generalizing from "subtyping" to "safe casting precondition" (though the 
two coincide given the restrictions on instanceof today.)  The question 
is largely a pedagogical one; how do we help people see that "subtyping 
operator" is merely a convenient description of what instanceof has done 
to date?

We made a choice to lump rather than split by having `instanceof` take a 
pattern on the RHS as well as a type.  This choice is not without its 
challenges (mostly, the confusion around whether patterns match null or 
not), but it also illustrates that people can get over a narrow view of 
what `instanceof` "means", since this has generally not been a problem 
to date.  The leap from "reference types only" to "all types" is a 
smaller one, though it appeals to a broader view of polymorphism.

When restricted to reference types, `instanceof` is a question about 
subtyping relative to inclusion polymorphism.  When we bring in 
primitive widening/narrowing, we are appealing to coercion polymorphism 
too -- "can this value be coerced to this type without getting 
mangled."  When we bring in boxing and unboxing, we appeal to another 
form of coercion.  (Both forms are covered under existing conversion 
rules.)  I suspect this direction is not likely to be helpful, since 
these terms are not particularly widely used in the Java community.

Positioning "instanceof TYPE" as the "precondition for safe casting to 
TYPE" seems a pretty simple leap to me, since "instanceof TYPE" is 
basically never seen in the wild when not immediately followed by a cast 
to the same type.  Which makes sense; casting is risky (unless the type 
pairs involved are known to be related in a certain way), and instanceof 
is how you avoid casting surprises.

Is there a better way to explain this?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-spec-observers/attachments/20220909/1e0df50c/attachment-0001.htm>


More information about the amber-spec-observers mailing list