<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">Hi all, newbie here.  </div><div class=""><br class=""></div><div class="">First off — loving Amber features.</div><div class=""><br class=""></div><div class="">Now, a *very narrow* observation about how JDK 20 handles sealed type selector expressions.</div><div class="">(Code snippet below.)</div><div class=""><br class=""></div><div class="">If a sealed type S later grows its list of permitted subtypes at some point, </div><div class="">how should the compiler handle switch blocks with S as selector?</div><div class=""><br class=""></div><div class="">In the absence of a catchall label (i.e. <span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">“case default -> ...” or “case S s -> ...”) ,</span></div><div class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">the compiler already correctly issues an error that coverage is incomplete.</span></div><div class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><br class=""></span></div><div class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">But if the block ended with a catchall label, the compiler is silent; the best that</span></div><div class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">can be hoped-for is that the coder throws a defensive exception in the catchall label </span></div><div class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">(and hope that it is triggered in testing).</span></div><div class=""><span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><br class=""></span></div><div class=""><div class=""><font color="#000000" class=""><span style="caret-color: rgb(0, 0, 0);" class="">Suggestion</span></font>:</div></div><div class=""><br class=""></div><div class="">Compiler should *disallows* catchall statements in switch blocks that use a sealed type </div><div class=""><b style="font-style: normal;" class=""><u class="">in the switch selector expression</u></b>.  Note that this special case does not affect all the </div><div class="">other non-sealed-type selectors (e.g. Object o), and appears (to me) to strengthen the</div><div class="">safety-value of sealed types in this particular scenario (similar to enums).  </div><div class=""><br class=""></div><div class=""><div class="">All in Java’s spirit of <span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">“least surprise”.</span></div></div><div class=""><br class=""></div><div class="">Cheers, </div><div class="">Robert</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">PS. reported behavior confirmed using jshell in JDK 20:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div style="margin: 0px; font-stretch: normal; line-height: normal; font-family: Menlo; color: rgb(0, 0, 0); font-size: 18px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">jshell --enable-preview</span></div></div><div class=""><div style="margin: 0px; font-stretch: normal; line-height: normal; font-family: Menlo; color: rgb(0, 0, 0); font-size: 18px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">|  Welcome to JShell -- Version 20</span></div></div><div class=""><div style="margin: 0px; font-stretch: normal; line-height: normal; font-family: Menlo; color: rgb(0, 0, 0); font-size: 18px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">|  For an introduction type: /help intro</span></div></div></blockquote><div class=""><br class=""></div><div class="">on the following:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class="">sealed interface S permits S.X, S.Y, S.Z, S.NEWBIE {</div><div class=""><br class=""></div><div class="">final class X implements S {};</div><div class=""><br class=""></div><div class="">final class Y implements S {};</div><div class=""><br class=""></div><div class="">final class Z implements S {};</div><div class=""><br class=""></div><div class="">final class NEWBIE implements S {};</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">       </span>public static void main(String [] sa) {</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>    S something = new NEWBIE();</div><div class=""><span class="Apple-tab-span" style="white-space:pre"> </span>    System.out.println(</div><div class=""><span class="Apple-tab-span" style="white-space:pre">         </span>switch (something) {</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                      </span>case null -> 0;</div><div class="">        <span class="Apple-tab-span" style="white-space:pre">            </span>case X x -> 1;</div><div class="">        <span class="Apple-tab-span" style="white-space:pre">             </span>case Y y -> 2;</div><div class="">        <span class="Apple-tab-span" style="white-space:pre">             </span>case Z z -> 3;</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                 </span>case S s -> -1;</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                        </span>// case default -> -1;</div><div class=""><span class="Apple-tab-span" style="white-space:pre">         </span>});</div><div class="">    <span class="Apple-tab-span" style="white-space:pre"> </span>};</div><div class="">}</div></blockquote><div class=""><br class=""></div></body></html>