<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div><br></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>From: </b>"Clayton Wohl" <claytonwohl@gmail.com><br><b>To: </b>"amber-dev" <amber-dev@openjdk.org><br><b>Sent: </b>Wednesday, July 27, 2022 8:26:52 PM<br><b>Subject: </b>Record Pattern Bug in Java 19<br></blockquote></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div dir="ltr"><div>// The example given in Brian Goetz's article: <a href="https://www.infoq.com/articles/data-oriented-programming-java/" target="_blank">https://www.infoq.com/articles/data-oriented-programming-java/</a><br>sealed interface Opt<T> {<br>    record Some<T>(T value) implements Opt<T> { }<br>    record None<T>() implements Opt<T> { }<br>}<br><br>// This works: Exhaustive switch without default case, but no record pattern<br>public static void thisWorks1(int value) {<br>    Opt<String> optValue = doSomethingThatReturnsOpt(value);<br>    switch (optValue) {<br>        case Opt.Some<String> some -> System.out.printf("got string: %s%n", some.value());<br>        case Opt.None<String> none -> System.out.println("got none");<br>    };<br>}<br><br>// This works: record pattern in a switch statement with a default case.<br>public static void thisWorks2(int value) {<br>    Opt<String> optValue = doSomethingThatReturnsOpt(value);<br>    switch (optValue) {<br>        case Opt.Some<String>(String v) -> System.out.printf("got string: %s%n", v);<br>        case Opt.None<String> none -> System.out.println("got none");<br>        default -> System.out.printf("default%n");<br>    };<br>}<br><br>// This does NOT compile: Exhaustive switch without default case + record pattern<br>public static void thisDoesNotWork(int value) {<br>    Opt<String> optValue = doSomethingThatReturnsOpt(value);<br>    switch (optValue) {<br>        case Opt.Some<String>(String v) -> System.out.printf("got string: %s%n", v);<br>        case Opt.None<String> none -> System.out.println("got none");<br>    };<br>}<br></div><br><div>This is with the latest public JDK 19 build: <span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0);font-family:Menlo;font-size:11px">build 19-ea+32-2220</span></div>





<br>I hope I'm posting to the correct list. If this list is for internal Java developers only, I'm sorry.</div></blockquote><div><br></div><div>oops, i can reproduce it<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>~/jdk/jdk-19.jdk/Contents/Home/bin/javac --enable-preview -source 19 Opt.java<br>Opt.java:7: error: the switch statement does not cover all possible input values<br>        switch (optValue) {<br>        ^<br>Note: Opt.java uses preview features of Java SE 19.<br>Note: Recompile with -Xlint:preview for details.<br>1 error<br><br data-mce-bogus="1"></div><div>RĂ©mi<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div></div></div></body></html>