It should be possible to type a switch expression with void

Remi Forax forax at univ-mlv.fr
Sun Sep 26 19:11:24 UTC 2021


There is a bad interaction between a lambda and a switch expression,
a lambda allows its expression to be typed void but a switch expression can not be typed void,
so the following code does not compile 

  sealed interface I permits A, B {}
  record A() {}
  record B() {}
  
  public Optional<A> findOneA(List<I> list) {
    return list.stream()
      .<A>mapMulti((i, consumer) -> switch(i) {
          case A a -> consumer.accept(a);
          case B b -> {}
      })
      .findFirst();
  }

This bug occurs for with any methods that takes a Consumer has parameter (so stream.forEach/peek, Iterator.forEachRemaining etc).

The workaound is to add a pair of curly braces around the switch to transform it to a switch statement.

For me, it should be possible to have a switch expression typed void. This is a backward compatible change given that the code does not compile otherwise.

regards,
Rémi


More information about the amber-spec-experts mailing list