[patterns] Several patterns and guards

Fred Toussi fredt at users.sourceforge.net
Mon Aug 14 12:50:46 UTC 2023


Indeed 'when' should be treated as a qualifier for 'Integer _' and 'String _' rather than the whole 'case ...' and there shouldn't be a need for the casts.

void test(Object obj) {
   switch (obj) {
     case Integer _ when obj > 0,
         String _ when obj.isEmpty()
             -> System.out.println("Positive number or non-empty string");
     default -> System.out.println("other");
   }


On Mon, Aug 14, 2023, at 13:15, Tagir Valeev wrote:
> Hello!
>
> Currently, when the switch label contains several patterns, only one
> guard could be declared, which is applied to all the patterns at once.
> In other words, the following code is not possible:
>
> void test(Object obj) {
>   switch (obj) {
>     case Integer _ when ((Integer) obj) > 0,
>          String _ when !((String) obj).isEmpty()
>             -> System.out.println("Positive number or non-empty string");
>     default -> System.out.println("other");
>   }
> }
>
> Does it make sense to lift this restriction? Probably it could be
> useful to declare separate guards? Ideally it should be possible to be
> able to declare a pattern variable, which is visible inside the
> pattern-specific guard only (but not inside the rule body).
>
> Another confusing thing here:
>
> void test(Object obj) {
>   switch (obj) {
>     case Integer _,
>          String _ when !((String) obj).isEmpty()
>             -> System.out.println("Number or non-empty string");
>     default -> System.out.println("other");
>   }
> }
>
> Now, the guard is applied even if obj is Integer (resulting in
> ClassCastException). This is not quite evident from the code. We may
> say that 'when' precedence is lower than ',' precedence, but people
> may expect the opposite. Should not we reconsider this and make guard
> a part of the lebel element, rather than the part of the whole label?
>
> With best regards,
> Tagir Valeev.


More information about the amber-spec-observers mailing list