> De: "Tagir Valeev" <amae...@gmail.com> > À: "Brian Goetz" <brian.go...@oracle.com> > Cc: "Remi Forax" <fo...@univ-mlv.fr>, "amber-spec-experts" > <amber-spec-experts@openjdk.java.net> > Envoyé: Dimanche 30 Août 2020 16:55:14 > Objet: Re: When several patterns are total ?
> Interesting! > How about > try {...} > catch(Ex1 | Ex2 e) { > switch (e) { > case Ex1 -> ... > case Ex2 -> ... > } > } > ? I also wonder if the precise exception trick should work: try { ... } catch(IllegalAccesException | NoSuchMethodException e) { throw switch(e) { case ReflectiveOperationException e -> e; }; } from the POV of the compiler, it's like throwing IllegalAccesException | NoSuchMethodException and not ReflectiveOperationException. so the code can be refactored to try { ... } catch(IllegalAccesException | NoSuchMethodException e) { throw e; } > With best regards, > Tagir Valeev. Rémi > вс, 30 авг. 2020 г., 21:38 Brian Goetz < [ mailto:brian.go...@oracle.com | > brian.go...@oracle.com ] >: >> , >>> i've hinted that there is an issue with intersection type and totality, but >>> we >> > did not follow up. >> > Here is the issue >> > var value = flag? "foo": 42; >> > switch(value) { >> > case String s -> ... >> > case Integer i -> ... >> > case Serializable s -> >> > case Comparable<?> c -> >> > } >>> given that the type of value is an intersection type Serializable & >> > Comparable<?> & ... >>> the last two cases are total with respect to the type of value. which does >>> not >> > go well with the current semantics that can only have one total case. >> Let’s separate the issues here. The type involved is an infinite type, which >> I >> think we can agree is a distraction. But lets assume the type of value were >> Serializable&Comparable (S&C for short.) >> Because S&C <: S, the `case S` in your example is already total, so the >> `case C` >> should be a dead case and yield a compilation error. According to the rule we >> have, `case S` is total on any U <: S, so it is total on S&C, so the current >> model covers this, and the `case C` is identified as dead by the compiler. >> Which makes sense because there’s no value it can match. >> I’m not seeing the problem?