I'm just thinking if such arrangement allows expressing all possible
situations that may arise in a switch.
Imagine one wants to switch on (Object o) and have the following cases:
- String: case 1
- CharSequence or null: case 2
- any other: case 3
How would one structure such switch? Would case 2 have to be split
before and after case 1?
Probably, but there are still some open questions that might affect the
answer. Note this is not all that different from:
- String: case 1
- CharSequence, or the constant string "Foo": case 2
- any other: case 3
The goal is not necessarily to be able to represent any chain of
conditionals in switch, though of course we do not want to gratuitously
make it difficult.
As I mentioned in the "lots of lousy ways to say T or null" section, we
can make this easier at the cost of greater complexity. Type patterns
have a binding variable; constant patterns (currently) do not. If they
did, you could say:
case String s: ...
case null x, CharSequence x: ...
case Object: ...
But, this brings two kinds of complexity with it: binding merging, and
constant patterns with binding variables, which are (mostly) useless
except for corner cases like this.