On 15/04/2019 13:06, Brian Goetz wrote:


But it seems like we have already ruled this out - since, if typeof(new Object()) is 'RefObject', you don't want RefObject <: Object.

I think you misunderstood the "want" here (though it still may not be possible.)

The desired model is:
 - Object is the top type.  Everything is an Object.
 - Some objects have identity (RefObject), others do not (ValObject).  But they are all Object.

This means we want {Ref,Val}Object <: Object.  (Whether they are interface or class or something else.)

Seems like I've read this requirement:

"but we don’t want Object <: RefObject for obvious reasons"

backwards. So, what this means is that it would be type-sound regardless of interface vs. class choice. But the other concerns remain, e.g. as to the fact that the boundary between reinterpreted types (Object as RefObject) and non-reinterpreted types (Object as top type) seems very fuzzy.

Maurizio


One of the main reasons for wanting this setup is that it reflects the desired reality: everything is an object, but some are special objects (those with identity.)  The addition of value types is a big perturbation to the type system; reflecting it this way makes the object hierarchy reflect the reality and the desired intuition, and makes the distinction between ref/val slightly less magic.

(There are other reasons too; for example, wouldn't it be nice if ValObject.{wait,notify,notifyAll} were _ordinary final methods_ that threw in ValObject?  Again, slightly less magic.)


Reply via email to