While we could certainly do this, I think the cost-benefit runs in the wrong direction here. This sort of thing is better expressed as an if, and that’s fine. (I think you’ll agree that this example is a little bit contrived.).
> On Aug 14, 2023, at 5:15 AM, Tagir Valeev <amae...@gmail.com> 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.