To close the loop, in the initial "Eclair" discussion (which grew out of a conversation at the last JVMLS), a primitive was a pair of classes, where the companion class was actually an interface.  We haven't revisited "what is Point.ref" since then, but one possible way to do this is to say exactly this: that Point is a primitive class, and Point.ref is an interface it implements.  That makes it clear that (a) why it is a reference type, (b) that it is no different from other superinterfaces, and (c) that no object is actually of type Point.ref.

Q1: does this help?

Q2: Does this provide us a path to rehabilitating the user intuition around boxing, by saying "good news everyone, we still have boxes, but now they're interfaces, not concrete objects."  Does that balance the desire to lean on existing intuition, while breaking enough about the implementation assumptions to not carry all the existing baggage?



In the new world, Point.ref is like Comparable; it exists as a static type for variables, but there are no objects that are *instances* of Point.ref, because its not a concrete type.

    Point p = new Point(3, 4);
    Point.ref asRef = p;

This is like the String to Comparable example; the new variable refers to the same object, but through an alias that has a different static type.

Reply via email to