Feedback: refining the inference of yield type in a switch

Remi Forax forax at univ-mlv.fr
Thu Jan 27 07:57:12 UTC 2022


Here are several examples showing that the inference does work as expected from a beginner POV,
the first two examples come from one of my student.
 
Here, list is typed as List<?> instead of List<String>
  var value = ...
  var list = switch (value) {
    case 0 -> List.of();
    case 1 -> List.of("foo");
    default -> throw new AssertionError();
  };

if we add a cast in front of to try to help inference
  var list = (List<String>) switch (value) {
    case 0 -> List.of();
    case 1 -> List.of("foo");
    default -> throw new AssertionError();
  };
the inference does not care, so it becomes an unsafe cast.

Declaring the type explicitly works
  List<String> list = switch (value) {
    case 0 -> List.of();
    case 1 -> List.of("foo");
    default -> throw new AssertionError();
  };

Specifying the type argument for List.of() also works.
  var list = switch (value) {
    case 0 -> List.<String>of();
    case 1 -> List.of("foo");
    default -> throw new AssertionError();
  };

To summarize, the inference considers each yield type one by one instead of all together (each one adding it's own constraints).
I think we should refine the way the inference work so "it just works" in this kind of case.

regards,
Rémi


More information about the amber-spec-experts mailing list