The interfaces IdentityObject and ValueObject must die !

John Rose john.r.rose at oracle.com
Wed Jan 26 23:47:46 UTC 2022



On 26 Jan 2022, at 7:42, Dan Smith wrote:

> On Jan 26, 2022, at 2:18 AM, 
> forax at univ-mlv.fr<mailto:forax at univ-mlv.fr> wrote:
>
> In other words: I don't see a use case for distinguishing between 
> primitive and
> value classes with different interfaces.
>
> Primitive classes does not allow nulls and are tearable, following 
> your logic, there should be a subclass of ValueObject named 
> PrimitiveObject that reflects that semantics.
>
> But this isn't a property of the *class*, it's a property of the 
> *type*, as used at a particular use site. If you want to know whether 
> an array is flattened, the class of the component can't tell you.
>
> This is especially useful when you have an array of PrimitiveObject, 
> you know that a storing null in an array of PrimitiveObject will 
> always generate a NPE at runtime and that you may have to use either 
> the volatile semantics or a lock when you read/write values from/to 
> the array of PrimitiveObject.
>
> For examples,
>  public void m(PrimitiveObject[] array, int index) {
>    array[index] = null;  // can be a compile time error
>  }
>
> If we said
>
> class Point implements PrimitiveObject
>
> then it would be the case that
>
> Point.ref[] <: PrimitiveObject[]
>
> and so PrimitiveObject[] wouldn't mean what you want it to mean.
>
> We could make a special rule that says primitive types are subtypes of 
> a special interface, even though their class does not implement that 
> interface. But that doesn't really work, either—primitive types are 
> monomorphic. If you've got a variable with an interface type, you've 
> got a reference.
>
> We could also make a special rule that says arrays of primitive types 
> implement an interface PrimitiveArray. More generally, we've 
> considered enhancements to arrays where there are different 
> implementations provided by different classes. That seems plausible, 
> but it's orthogonal to the IdentityObject/ValueObject feature.
>
> Meanwhile, I'd suggest writing the method like this, using universal 
> generics:
>
> <T>  public void m(T[] array, int index) {
>    array[index] = null;  // null warning
>  }
>
> An impossible type, it's a type that can be declared but no class will 
> ever match.
>
> Examples of impossible types, at declaration site
>  interface I extends ValueObject {}
>  interface J extends IdentityObject {}
>  <T extends I & J> void foo() { }
>
> It would definitely be illegal to declare a class that extends I and 
> J. Our rules about well-formedness for bounds have always been 
> sketchy, but potentially that would be a malformed type variable.
>
> Abandoning the property entirely would be a bigger deal.
>
> If we do not use interfaces, the runtime class of java.lang.Object can 
> be Object, being an identity class or not is a just a bit in the 
> reified class, not a compile time property, there is contamination by 
> inheritance.
>
> Object can't be an identity class, at compile time or run time, 
> because some subclasses of Object are value classes.
>
> What you'd need is a property of individual *objects*, not represented 
> at all with the class. Theoretically possible, but like I said, a 
> pretty big disruption to our current model.
>
> For me, it's like opening the door of your house to an elephant 
> because it has a nice hat and saying you will fix that with 
> scotch-tape each time it touches something.
>
> Ha. This sounds like maybe there's a French idiom involved, but anyway 
> we should try to get John to add this to his repertoire of analogies.


More information about the valhalla-spec-observers mailing list