Making Object abstract

Remi Forax forax at univ-mlv.fr
Thu Jun 17 11:40:09 UTC 2021


----- Mail original -----
> De: "John Rose" <john.r.rose at oracle.com>
> À: "Brian Goetz" <brian.goetz at oracle.com>
> Cc: "daniel smith" <daniel.smith at oracle.com>, "valhalla-spec-experts" <valhalla-spec-experts at openjdk.java.net>
> Envoyé: Mercredi 16 Juin 2021 23:50:35
> Objet: Re: Making Object abstract

> On Jun 2, 2021, at 7:57 AM, Brian Goetz <brian.goetz at oracle.com> wrote:
>> 
>> A minor bikeshed comment: We're asking users to change their `new Object()` to
>> `IdentityObject.newIdentity()`, and they may ask "why do I have to say
>> 'Identity' twice"?  (And by ask, I mean grumble, because we're already asking
>> them to change their working code.)
>> 
>> After a few minutes of thought, I think it might be a better fit to put this at
>> Objects::newIdentity.  The methods in Objects are conveniences that users could
>> write themselves, which this basically is -- there's nothing special about this
>> method, other than having a preferred alternative to `new Object()` which users
>> will understand.  So parking this where the Object conveniences go seems
>> slightly lower friction.
> 
> I think this is OK.
> 
> As a stretch move, I think we can even retro-upgrade
> the type checking of Objects::newIdentity with type
> variable trickery, when IdentityObject becomes real.
> 
> Please see:
> 
> https://bugs.openjdk.java.net/secure/attachment/95170/Foo.java
> https://bugs.openjdk.java.net/browse/JDK-8268919


I wonder if a simple way to avoid to allow any Ts if to allow to specify an intersection type as parameter type and/or return type of methods (we have 'var' inside the body)
so instead of

  public static <T extends Object & IdentityObject> T newIdentity() {

we can write
  
  public static Object & IdentityObject newIdentity() {

This requires a grammar change but it's exactly the type we want.


> 
> — John

Rémi


More information about the valhalla-spec-observers mailing list