Null restricted type and JSpecify
forax at univ-mlv.fr
forax at univ-mlv.fr
Wed Nov 30 17:06:49 UTC 2022
----- Original Message -----
> From: "John Rose" <john.r.rose at oracle.com>
> To: "Remi Forax" <forax at univ-mlv.fr>
> Cc: "valhalla-spec-experts" <valhalla-spec-experts at openjdk.java.net>
> Sent: Wednesday, November 30, 2022 6:01:42 PM
> Subject: Re: Null restricted type and JSpecify
> Kevin & co won’t like this maybe, but I think this design and our Valhalla
> design do not conflict, precisely because they make completely distinct sets of
> assertions, and yet the assertions (taken together) are consistent.
>
> What we are talking about here is X! on non-type-vars. That means we are adding
> a state EXPLICIT_MINUS_NULL, which (a) has an obvious relation to the other
> states in JSpec., and (b) can have a semantic weight different from anything in
> JSpec.; it can and should translate to a different Q-descriptor.
if it's L-descriptor in descriptors but Q-descriptor in TypeRestriction + bytecodes, yes !
I think being able to add a '!' if you have overlook one should be an option.
Rémi
>
> On 23 Nov 2022, at 5:03, Remi Forax wrote:
>
>> Hi all,
>> i've taken a look to JSpecify [1] to see how it works with the recent proposal
>> from Brian, seen value types as null restricted types.
>>
>> Obviously, i'm not an expert in the details of JSpecify so feel free to correct
>> me.
>>
>> I really like JSpecify, the specification is simple and lean but yet at the same
>> time guides users towards a null safe Java.
>>
>> JSpecify specifies two annotations, @NullMarked and @Nullable. @NullMarked (on a
>> class, a package or a module) says that any types in that scope is not null
>> (NO_CHANGE) by default. @Nullable indicates that a type is nullable
>> (UNION_NULL), inside a @NullMarked scope or not.
>> A type outside the the @NullMarked scope and not marked as @Nullable is
>> unspecified (UNSPECIFIED) [2].
>>
>> Compared to the null restricted type proposal, there are IMO two major
>> differences,
>> - the fact that JSpecify uses annotations implies that adding nullness
>> information is a binary backward compatible change.
>> - there is no @NonNull, a lack of @Nullable inside a @NullMarked scope encodes
>> the fact that a type is non null.
>>
>> The former suggests that we should investigate erasing Q-type to L-type inside
>> method/field descriptors. The later suggests that either we should embrace this
>> approach too and only provides '?' or we should allow both '!' (NO_CHANGE) and
>> '?' (UNION_NULL) but it makes the transition from actual Java to a null safe
>> Java less clear.
>>
>> The other difference, which was noted by Kevin during our meeting last week,
>> JSpecify is specified in term of subtyping relationship not in term of
>> boxing/unboxing rules. For me, boxing/unboxing rules are less specific that
>> subtyping in assignments but more specific in case of overriding, so i've no
>> idea if this is an issue or not.
>>
>> regards,
>> Rémi
>>
>> [1] https://jspecify.dev/
>> [2] there is a 4th state which is MINUS_NULL but it's for type variable, so not
> > something which is directly related to value types.
More information about the valhalla-spec-observers
mailing list