1. Reported error about JEP 432's enhanced for loop, when deconstructing a record with primitive components.
public class RecordPatternTest {
public static void main(String argv[]) {
Point[] pointArray = {new Point(1,2), new Point(3,4)};
dump(pointArray);
}
record Point(int x, int y) {}
static void dump(Point[] pointArray) {
for (Point(int x, int y) : pointArray) {
System.out.println("(" + x + ", " + y + ")");
}
}
}
$ java --enable-preview --source 20 RecordPatternTest.java
RecordPatternTest.java:10: error: '.class' expected
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: ';' expected
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: '.class' expected
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: not a statement
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: ';' expected
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: not a statement
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: ';' expected
for (Point(int x, int y) : pointArray) {
^
7 errors
error: compilation failed
However, if we use “var” instead of “int”, i.e.
for (Point(var x, var y) : pointArray) {
then it works:
$ java --enable-preview --source 20 RecordPatternTest.java
Note: RecordPatternTest.java uses preview features of Java SE 20.
Note: Recompile with -Xlint:preview for details.
(1, 2)
(3, 4)
2. Nested patterns raise parsing error
3. Lambdas in normal for erroneously parsed as patterns:
static <T> void method2(Function<Integer, Integer> f) {}
int i = 42;
for (method2((Integer a) -> 42); i == 0;) { i++; }
public class RecordPatternTest {
public static void main(String argv[]) {
Point[] pointArray = {new Point(1,2), new Point(3,4)};
dump(pointArray);
}
record Point(int x, int y) {}
static void dump(Point[] pointArray) {
for (Point(int x, int y) : pointArray) {
System.out.println("(" + x + ", " + y + ")");
}
}
}
$ java --enable-preview --source 20 RecordPatternTest.java
RecordPatternTest.java:10: error: '.class' expected
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: ';' expected
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: '.class' expected
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: not a statement
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: ';' expected
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: not a statement
for (Point(int x, int y) : pointArray) {
^
RecordPatternTest.java:10: error: ';' expected
for (Point(int x, int y) : pointArray) {
^
7 errors
error: compilation failed
However, if we use “var” instead of “int”, i.e.
for (Point(var x, var y) : pointArray) {
then it works:
$ java --enable-preview --source 20 RecordPatternTest.java
Note: RecordPatternTest.java uses preview features of Java SE 20.
Note: Recompile with -Xlint:preview for details.
(1, 2)
(3, 4)
2. Nested patterns raise parsing error
3. Lambdas in normal for erroneously parsed as patterns:
static <T> void method2(Function<Integer, Integer> f) {}
int i = 42;
for (method2((Integer a) -> 42); i == 0;) { i++; }
- is cloned by
-
JDK-8297986 java.lang.AssertionError: <captured wildcard> in wildcard generic record pattern matching
-
- Closed
-