> De: "Guy Steele" <guy.ste...@oracle.com>
> À: "Brian Goetz" <brian.go...@oracle.com>
> Cc: "amber-spec-experts" <amber-spec-experts@openjdk.java.net>
> Envoyé: Lundi 27 Juillet 2020 22:38:38
> Objet: Re: Observation about nulls in type patterns

>> On Jul 27, 2020, at 4:25 PM, Brian Goetz < [ mailto:brian.go...@oracle.com |
>> brian.go...@oracle.com ] > wrote:

>> ...

>> If get2 is some method that is declared to return Number then the second
>> pattern is total and will accept null; if get2 is declared to return
>> Object pattern the IS total and WILL accept null.

> In the text above quoted from Jens Lideström, is some text missing in the 
> third
> line?

> Returning to an earlier part of your message:

>> Of course, if you want to make it more obvious, you can write more explicit
>> code. You can, for example, refactor

>> switch (o.get1().get2()) {
>> case Integer i: ...
>> case Number n: ...
>> }

>> into

>> Number t = o.get1().get2();
>> switch (t) {
>> case Integer i: ...
>> case Number n: ...
>> }

>> and now it is more obvious again.

> Presumably that latter could also be written as

> switch ((Number)(o.get1().get2())) {
> case Integer i: ...
> case Number n: …
> }

> and it might become a popular idiom always to provide that explicit cast in
> switch statements, and especially switch expressions, when there might be any
> doubt as to whether the switch has total coverage?

Instead of having an idiom, we can use a restricted Java-ish syntax. 
For me it's a lot like when you want a serializable lambda and you end up with 
an ad hoc java-ish syntax (Foo & Serializable) s -> ... 

So i propose Number | null, 
switch (o.get1().get2()) { 
case Integer i -> ... 
case Number | null n -> … 
} 

it's a restricted syntax too, it's either "type | null" and it's obviously 
explicit, it also makes the rule that say if a switch accept null or not more 
obvious because it's decouple from the notion of a total coverage, if a case 
accept null then the switch accept null. 

> —Guy

Rémi 

Reply via email to