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