On 24/11/2020 14:45, Remi Forax wrote:


------------------------------------------------------------------------

    *De: *"Maurizio Cimadamore" <maurizio.cimadam...@oracle.com>
    *À: *"Brian Goetz" <brian.go...@oracle.com>, "Tagir Valeev"
    <amae...@gmail.com>
    *Cc: *"amber-spec-experts" <amber-spec-experts@openjdk.java.net>
    *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
            <brian.go...@oracle.com <mailto:brian.go...@oracle.com>>
            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 ?
I'm saying that it's (in my humble experience) a common enough pattern that I've seen often enough, so what Brian is proposing doesn't seem completely crazy to me - e.g. having some more 1st class support in the language for this sort of stuff can be a good thing.

  BarImpl impl(Bar bar) {
    return switch(bar) { case BarImpl impl -> impl; };
  }

Or am i missing something ?
See first-class :-) Sure, there are other ways to get there.

    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;

I think all your references to switch expression reinforce my feeling that having a pattern-matching based way to declare local variables (as the document I linked in [1] shows with its __let construct) might be one way to skin this cat.

Maurizio



    Maurizio


Rémi

    [1] -
    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.



Reply via email to