> De: "Maurizio Cimadamore" <[email protected]> > À: "Brian Goetz" <[email protected]>, "Tagir Valeev" <[email protected]> > Cc: "amber-spec-experts" <[email protected]> > Envoyé: Mardi 24 Novembre 2020 15:10:35 > Objet: Re: Relaxed assignment conversions for sealed types
> On 31/10/2020 23:30, Brian Goetz wrote: >>> On Oct 25, 2020, at 10:06 AM, Brian Goetz < [ mailto:[email protected] >>> | >>> [email protected] ] > wrote: >>> To make it clear that I'm not talking about the annoyance of typing the >>> cast, >>> let's pretend I'm suggesting to write it like this: >>> BarImpl bi = (__static BarImpl) b; >> Pulling on this string some more — I think there’s a connection between this >> feature and total statement switches. We’ve been looking for a way to make >> statement switches total, and here, what we’re looking for is a way to make >> _casts_ total. Which suggests this is one feature, not two. So perhaps: >> switch-total (x) { … } // a switch, but with added bonus totality checking >> BarImpl b = (total BarImpl) bar // a cast, but with added bonus totality >> checking > I agree the latter is a common enough problem when writing implementation code > where you have a sealed hierarchy and you know there's only one impl (Foreign > API has this all over the place). You think that not typechecking that BarImpl is the sole implementation of Bar everytime you write a cast is a problem ? I don't know for the Foreign API, but having a static helper method that takes a BarImpl and returns a Bar is not enough ? BarImpl impl(Bar bar) { return switch(bar) { case BarImpl impl -> impl; }; } Or am i missing something ? > To throw in the mix - how is some kind of pattern match assignment (we > referred > to as a "let expression" in some of the earlier docs [1]) would change the > picture here? In other words, maybe it's overloading `=` which is at odds > here, > and we need to make it more explicit that this is more akin to an > extraction/match? The match operator (as in let ... match), is more or less what C# as done by using switch as an operator, BarImpl impl(Bar bar) { return bar switch { case BarImpl impl -> impl; }; } It's still a possible syntax for total-switch. Anyway, it doesn't answer to your question, it seems you want something in the middle in between a cast and a switch, let impl = bar; > Maurizio Rémi > [1] - [ https://cr.openjdk.java.net/~briangoetz/amber/pattern-semantics.html | > https://cr.openjdk.java.net/~briangoetz/amber/pattern-semantics.html ] >> Obviously we can use another word besides `total`, but it’s a pretty good >> straw >> man.
