I'd like to remind everyone about this (self-important-sounding) document I shared some months ago: Data in Java programs: a basic conceptual model <https://docs.google.com/document/d/1J-a_K87P-R3TscD4uW2Qsbt5BlBR_7uX_BekwJ5BLSE/preview>
I may have undersold it a bit last time. True, it's not the final word on the only possible conceptual model anyone could ever form; however, it is at least a very extensively thought-out and reviewed and self-consistent one. I've also revised it a lot since you saw it (and it's still open for review). If nothing else, at least when I make arguments on this list you don't have to wonder what they are based on; I've laid it all out in black and white. And on that subject... The crux of that doc for Valhalla purposes is its clear separation between *objects* and *values* as wholly disjoint concepts. An *object*: has its own independent existence; is self-describing, thus can be polymorphic; is always indirected / accessed via reference; is eligible to have identity. A *value*: has no independent existence; is container-described, thus is strictly monomorphic; is always used directly / inline; cannot have identity. (Yes, I'm glossing over that references are also values, here.) What *unifies* objects and values (setting aside references) is that they are all *instances*. (First, to parrot Brian of a while ago: for a primitive type, the values are the instances of the type; for a reference type, the values are references to the instances of the type, those instances being objects.) Some instances are of a type that came from a class, so they get to have *members*. Some instances of are of a type that never *used* to have a class, but will now (int, etc.) -- yay. And some are of array types, which act like halfway-fake classes with a few halfway-fake members. Members for everybody, more or less! Though we have at times said "the goal of Valhalla is to make everything an object", I claim the unification we really want is for everything to be a class instance. I think that gives us enough common ground to focus on when we don't otherwise know which thing the thing is (e.g. with a type variable). One thing I like very much about this is that it fits perfectly with the fact that Integer is a subtype of Object and int is not. The way I think bucket 2 can and should be explained is: "in the *programming model* it absolutely is an object. In the *performance model*, the VM can replace it undetectably with a (compound) value. But that is behind the scenes; it's still behaviorally an object and don't feel bad about calling it an object." To me this is very simple and sensible. If we instead want to say "the int value 5 is an object now too", then we have some problems: * I think it ruins those clean explanations just given * we'd need to coin some new term to mean exactly what I've just proposed that "object" mean, and I have no idea what that would be (do you?) What are the latest thoughts on this? -- Kevin Bourrillion | Java Librarian | Google, Inc. | kev...@google.com