<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><font face="Menlo" class="">Here’s a little more detail on this choice.  <span style="background-color: rgb(255, 255, 255);" class="">Assuming that we:</span></font><div class=""><font face="Menlo" class=""><span style="background-color: rgb(255, 255, 255);" class=""><br class=""></span></font><div class=""><font face="Menlo" class=""><tt style="background-color: rgb(255, 255, 255);" class=""> - Outlaw primitive type-test patterns, except in type-restating contexts;<br class=""> - Outlaw numeric constant patterns, except where the switch target type is a primitive or a box type.<br class=""><br class="">We can now define how we can validate whether patterns are potentially applicable (and statically reject those that are not.)<br class=""><br class="">Let's say that the static type of the target is S.  <br class=""><br class=""><b class="">Type test patterns.  </b>A type test pattern for type T is potentially applicable as follows:<br class=""></tt><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><tt class=""><tt class=""> </tt>- ref(S) && ref(T): if S is cast-convertible to T<br class=""> </tt><tt class=""></tt>- prim(S) || prim(T): if T == S, modulo boxing/unboxing<br class=""> - val(S): if S == T, modulo boxing<br class=""> - ref(S) && val(T): if S is cast-convertible to box(T)<br class=""><br class="">If a pattern is not potentially applicable to the static type of the target, a compiler error ensues.  <br class=""><br class="">There are two possibly odd things here:<br class=""> - Tight restrictions on when you can use primitive type-test patterns;<br class=""> - Asymmetry between primitive and values (when we have them).  <br class=""><br class="">Both stem from the fact that primitive types have nontrivially overlapping value sets; type tests for "int x" and "long x" overlap, but type tests for named values never do.  </tt></tt></font></div><div class=""><font face="Menlo" class=""><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><br class="">If you want to ask whether an Object is an int, you can ask for a specific box type (or a shared supertype like Number) instead, either using a type-test pattern or a static destructuring pattern like Integer.valueOf(int x).<br class=""><br class=""><b class="">Destructuring patterns.  </b>Destructuring patterns for a type T (reference or value) have the same applicability restrictions as type-test patterns for T.<br class=""><br class=""><b class="">Constant patterns.  </b>Constant patterns have applicability restrictions as follows:<br class=""> - String literals: if S is cast-convertible to String<br class=""> - Enum </tt></tt><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><tt class=""><tt class="">literals </tt></tt>(fully qualified): if S is cast-convertible to the enum type<br class=""> - Enum </tt></tt><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><tt class=""><tt class="">literals</tt></tt> (abbreviated): if S is the enum type<br class=""> - Class </tt></tt><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><tt class=""><tt class="">literals</tt></tt>: if S is cast-convertible to Class (we may wish to not support Class literals as a constant pattern, though)<br class=""> - Numeric </tt></tt><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><tt class=""><tt class="">literals</tt></tt>: if S is a primitive type or box, and the constant is a valid literal for that primitive type<br class=""> - Boolean </tt></tt><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><tt class=""><tt class="">literals</tt></tt>: if S cast-convertible to Boolean (though switches on boolean or Boolean should be disallowed; use if.  Rationale to be provided separately.)<br class=""> - Null literal: if S is a reference type<br class=""><br class="">Note that all of this is not about "there are multiple kinds of switch", as much as statically eliminating silly combinations of patterns and targets based on typing.<br class=""><br class=""></tt></tt><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><br class=""></tt></tt></font><div><font face="Menlo" class=""><br class=""></font><blockquote type="cite" class=""><div class=""><font face="Menlo" class="">On Nov 4, 2017, at 4:55 PM, Mark Raynsford <<a href="mailto:mark@io7m.com" class="">mark@io7m.com</a>> wrote:</font></div><font face="Menlo" class=""><br class="Apple-interchange-newline"></font><div class=""><div class=""><font face="Menlo" class="">On 2017-11-03T21:30:17 +0100<br class="">Remi Forax <<a href="mailto:forax@univ-mlv.fr" class="">forax@univ-mlv.fr</a>> wrote:<br class=""><br class=""></font><blockquote type="cite" class=""><font face="Menlo" class="">I'm happy with choice #3 too. <br class=""><br class=""></font></blockquote><font face="Menlo" class=""><br class="">Seconded. <br class=""><br class="">On 2017-11-03T15:37:20 -0400<br class="">Brian Goetz <<a href="mailto:brian.goetz@oracle.com" class="">brian.goetz@oracle.com</a>> wrote:<br class=""></font><blockquote type="cite" class=""><font face="Menlo" class=""><br class=""> - There isn't really an overwhelming need for being able to say "Is <br class="">this Object a numeric zero" or "Is this object a boxed primitive in the <br class="">range of int."<br class=""></font></blockquote><font face="Menlo" class=""><br class="">I agree. From my experience, despite the best efforts of autoboxing,<br class="">many programmers treat primitives and references as being from entirely<br class="">separate worlds. I'd therefore not really expect people to be matching<br class="">on arbitrary things and relying on quiet primitive conversions behind<br class="">the scenes to get the behaviour they want.<br class=""><br class="">This is obviously purely subjective!<br class=""><br class="">-- <br class="">Mark Raynsford | <a href="http://www.io7m.com" class="">http://www.io7m.com</a><br class=""><br class=""></font></div></div></blockquote></div><br class=""></div></div></body></html>