[patterns] Multiple patterns without unnamed variables
Tagir Valeev
amaembo at gmail.com
Wed Aug 16 09:07:16 UTC 2023
Hello!
Just discovered a small discrepancy between spec and implementation in
JDK 21. Consider the following code:
public class Test {
record R1() {}
record R2() {}
static void test(Object obj) {
switch (obj) {
case R1(), R2() -> System.out.println("R1 or R2");
default -> System.out.println("other");
}
}
public static void main(String[] args) {
test(new R1());
}
}
It can be executed using java build 21-ea+27-2343 _without_ enabling preview:
>\jdks\jdk-21\bin\java.exe Test.java
R1 or R2
However, the spec draft for JDK 21 [1] doesn't allow several patterns
in the same switch label. See the SwitchLabel production on the page 501:
SwitchLabel:
case CaseConstant {, CaseConstant}
case null [, default]
case CasePattern [Guard] // only one pattern is allowed!
default
Such code is legal under JEP-443 but it should require
--enable-preview. On the other hand, I understand how it happens.
Probably it would be better to update the JDK 21 spec to allow it? Or
it should be considered as a compiler bug?
With best regards,
Tagir Valeev.
[1] https://cr.openjdk.org/~iris/se/21/latestSpec/java-se-21-jls-pr-diffs.pdf
More information about the amber-spec-observers
mailing list