It should be possible to type a switch expression with void

Brian Goetz brian.goetz at oracle.com
Mon Sep 27 15:07:06 UTC 2021


This is part of a larger problem, and I don't think point fixes are 
really the answer here.  For this reason (and others), any sort of "type 
more things as void" is on hold for now.  Here's a sketch of the 
motivation, which comes from Valhalla.

A big part of Valhalla is unifying primitives and references. This means 
(yay) that we can say goodbye to IntPredicate and friends, since we can 
have:

     interface IntPredicate extends Predicate<int> { ... }

In turn, we can also start to unify Predicate into Function:

     interface Predicate<T> extends Function<T, boolean> { ... }

But Consumer is a roadblock, because void is not a type.  We'd like to 
have a path to getting to this unification; tinkering with treating more 
statements as void expressions could make this harder.

On 9/26/2021 3:11 PM, Remi Forax wrote:
> 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20210927/822815ac/attachment.htm>


More information about the amber-spec-experts mailing list