[pattern-switch] Totality
Brian Goetz
brian.goetz at oracle.com
Fri Aug 28 13:45:41 UTC 2020
> While i agree with the general idea, i disagree with the fact that the
> compiler should handle the null and total cases, it can not handle the
> total case, it has to be handled by the by the runtime, not the compiler.
>
> I will use '?' for the total type, by example this switch is "total
> enough"
> sealed interface Stuff permits Pixel, Car {}
> record Pixel(int x, int y, Color color) implements Stuff {}
> record Car(Color color) implements Stuff {}
> switch(stuff) {
> case Pixel(? x, ? y, Color color) -> color;
> case Car(Color color) -> color
> }
>
> We have agreed during one of our first meetings that we want that if
> Pixel is changed to record Pixel(BigInteger x, BigInteger y, Color
> color) {} with or without recompilation of the switch it should be Ok.
I don't recall agreeing to anything like this, so perhaps you can dig up
a reference, and I can try to reconstruct what I thought I was agreeing to?
It seems that you are arguing that the use site of a pattern match
should be unaffected by (possibly incompatible) changes in the
declaration of the pattern. But this can't possibly be what you are
suggesting.
(If you want to have a conversation on what declaration changes are
behaviorally compatible, that is a fine conversation!)
> That doesn't mean that '?' can not be spelt 'var', but it demonstrates
> that the corner cases should be managed by the runtime, not the compiler.
>
I don't understand what you mean by this distinction. The compiler
identifies the corner cases, and generates runtime code to handle them,
just like it does with expression enum switches today.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20200828/7755f2e1/attachment.htm>
More information about the amber-spec-experts
mailing list