On 4/28/2021 5:34 PM, Maurizio Cimadamore wrote:
Thanks for this. It is especially helpful to see all the rules in a single place. So, armed with these rules - back to the first example I brought up: switch (lunch) { case Box(Soup s) { if (s == null) { System.err.println("Box of null"); } else { System.err.println("Box of soup"); } } case Bag(Soup s): { if (s == null) { System.err.println("Bag of null"); } else { System.err.println("Bag of soup"); } } }If I read the rules correctly, Box(Soup) + Bag(Soup) "cover" Container<Lunch>, with the exception of the { null, Box(null), Bag(null) }. So the above will throw when `lunch` is null, and will also throw with Box(null) or Bag(null). Correct?
Correct (under the "we make switches total" plan.)
So the right way to write that would be to add a couple of { case Box(null), case Bag(null) } - these will reduce the remainder of the switch blanket to just { null } - which means the switch will just throw on a null input value, as usual.
Correct. Any of the following would work to capture the remainder explicitly (not all of these are valid syntax, though):
case null, Box(null), Bag(null): // explicit remainder case null, Box, Bag: // basically the same case null, default: // default misses null, so we add it in case null, Container(null): // another way to say the same thing case Container c: // total pattern, catches everything
