I agree with Brian that most of the 'conversion-like' nature we see in V to V? is likely associated with Q-thinking, after having been a victim of it myself in a private conversation :-)

However, I think my more general point remains - the fact that the VM has the flexibility to treat V and V? as, fundamentally, the same thing shouldn't necessarily drive the conclusion that, _at the language level_ there should be a subtyping relationship between V and V?.

From a pedagogical perspective, whether we like it or not, users are immediately going to think in terms of box/unbox, so I think it'd be surprising if the new inline classes and their projections had rules radically different from those which apply to the int/Integer case.

Maurizio

On 01/05/2019 14:13, Brian Goetz wrote:
But, this is Q-world thinking.  In Q-world, values are like primitives, and we 
therefore need boxes to interoperate with objects.  In L-world, values *ARE* 
Object.  The difference is huge, and it takes some time to internalize just how 
different they are.  We’re all in varying degrees of realizing the implications.

Boxes are not a good thing; they were a necessarily evil that arises from the 
fact that primitives are not objects.  But they create many problems of their 
own.  I don’t see how “more boxes” is the answer here.

The main argument in favor of “more boxes” is that “users are already familiar 
with the model.”  For a while, we thought that was a good thing, but this is 
mostly Stockholm Syndrome…..



On May 1, 2019, at 9:07 AM, Maurizio Cimadamore 
<[email protected]> wrote:

I agree, in principle - and I have raised similar points in the past, that is:

V ~= int

V? ~= Integer

And have NO subtyping relationship between them; this puts the language on a 
solid footing, where we reuse existing conversion mechanism to sequence 
overload resolution and all that.

I think what pushed us down this path was perhaps the perceived usability fall 
back: e.g.  we can no longer pass a V where a V? is expected. But that's not 
really the case, as you still have assignment conversions between the two, 
which means it would work on assignment context and method calls (albeit with 
lower priority w.r.t  true subtypes, which is what we want anyway).

Maurizio

On 01/05/2019 13:57, Remi Forax wrote:
Brian ask me to make it its own thread.
so is V? what we need, because i believe we have been a little over our own 
head on this and loose the sight of what we need for V?.

we need V?
- to represent the L variation of a Q type.
- to interact with generics that are not reified.

V? does that but does far more, V? is a super type of V which is dangerous, 
because people will use it as parameter of function instead of V because it's a 
super type and works with null.
Here we are back to a world were every value types may be null.

I believe that the issue is that V? should work as a box and currently V? is to 
powerful/useful as a box so people will start to use it as a true type.
- V? should not be a supertype of V
- you should not be able to call methods or fields on V? (constructor are still 
allowed), again it should be a box, so the automatic conversions from/to V/V? 
are fine, but not more.

the moto for V? should be works like an Integer (not more).

Rémi

Reply via email to