Yes, that's right.

However, we can still place restrictions on _switch_ if we felt they were warranted.  For example, we could prohibit switch from taking arguments whose static type is float/Float, if we wanted to, or restrict constant `case` labels from having floating point patterns, without restricting nested matches (e.g., Complex(var re, 0.0d)).  Not saying that's a good idea, but we could do so without pulling the rug out from under the pattern matching tower.  (We play a related game with nulls.)

One restriction I think we should place (I've written about this before) is that we should restrict type-polymorphic numeric constant patterns and primitive type-test patterns in all pattern-matching contexts, except where they are type-restating. So these are OK:

    switch (anInt) {
        case 0: ...
        case int x
            where x < 0: ...
    }

    switch (anInteger) {
        case 0: ...
        case int x
            where x < 0: ...
    }

    switch (aFloat) {
        case 0.0f: ...
        case float f
            where f < 0.0f: ...
    }

But I think we should restrict this:

    switch (anObject) {
        case 0: ...
        case int x: ...
    }

This is because of the ambiguity that "Object 0" could be Integer 0, Long 0, Short 0, etc.  If you mean `Integer`, say `Integer` here.

On 12/15/2017 3:44 PM, Kevin Bourrillion wrote:
On Fri, Dec 15, 2017 at 11:58 AM, Dan Smith <[email protected] <mailto:[email protected]>> wrote:

    > On Dec 13, 2017, at 5:51 PM, John Rose <[email protected] 
<mailto:[email protected]>> wrote:
    >
    > But we only get to set the default once.  So perhaps we should delay
    > supporting floats directly, until we can put all three or four float
    > matching predicates in front of us and decide which is the default.

    > On Dec 14, 2017, at 9:09 AM, Kevin Bourrillion <[email protected] 
<mailto:[email protected]>>
    wrote:
    >
    > Switch on long: sure.
    >
    > Switch on float/double: why?

    When you guys say you'd like to _not_ support floating-points, I'm
    not sure what you mean.

    The input to a switch can have any type, including Object.


If this much is given, then yes, of course we should allow `switch (primitiveDouble)`. I was trying to connect the dots before and I think I've got them now. My /current/ limited understanding is that (a) it makes a lot of sense for the pattern-matching feature to use the existing switch construct, and (b) it follows inescapably from that that `switch (somePrimitiveDouble)` will work no matter what (via boxing) so therefore, right, we might as well just support it. Is that a reasonable way to put it?


--
Kevin Bourrillion | Java Librarian | Google, Inc. |[email protected] <mailto:[email protected]>

Reply via email to