abandon all U-types, welcome to L-world (or, what I learned in Burlington)

Dan Smith daniel.smith at oracle.com
Thu Nov 23 06:20:03 UTC 2017

> On Nov 22, 2017, at 6:48 AM, Brian Goetz <brian.goetz at oracle.com> wrote:
> What's the L-world story for array subtyping?  For any R-type, R[] <: Object[].  If everything is an L type and everything is <: Object, are arrays of Q-types/primitives also subtypes of Object[]?
> We didn't have a story for this in QU-world either, but at least in QU-world it was believable that QFoo[] <! Object[].  But that seems much less tenable when there's no syntactic difference between L-uses and Q-uses.  (And even less so when we might migrate code from L to Q.)

My two cents: we didn't discuss this in depth, but John raised it in this thread, and in the "design notes" document, I followed up with some details.
- Initially, QFoo[] is not a subtype of LFoo[]. You want covariant subtyping, you need to stick with L types.
- As an enhancement, we can introduce covariant Q-L subtyping, adjust the behavior of aaload/aastore, and explore the performance impact.

What's hard about treating QFoo[] as an LObject[] is that the layout is a dynamic property, requiring dynamic checks. But we may also be interested in pursuing non-uniform layout for QFoo[] (a specific idea: flattening generally but not for "volatile" instances), so there may be some satisfactory coping techniques coming.

On Java syntax: who says there's no syntactic difference between L-uses and Q-uses? You might spell the L-use "Complex?". But, anyway, that's a question to raise in a year, after we better understand the JVM.


More information about the valhalla-spec-observers mailing list