Why is a boolean expression valid in a case block, when booleans are not supported data types for switches?

Viewed 1420

After reading some of the SCJP certification last night, I got thinking about switch statements and how the expressions are evaluated, and I'm a little puzzled by something.

Java won't let you switch on a boolean, so the following will not compile :

public static void switchOnBoolean(boolean theBool)
    {
        System.out.println("\n\nAssessing boolean :" + theBool);
        // line below won't compile, since booleans are not valid for the switch statement
        switch(theBool)
        {
            case true:
            {
                System.out.println("The boolean was true");
                break;
            }
            case false:
            {
                System.out.println("The boolean was false");
            }
        }
    }

However, the compiler will not complain if you attempt to use an expression that evaluates to a boolean value in a case block, such as :

public static void switchOnChar(char theChar)
    {
        System.out.println("\n\nAssessing char : " + theChar);
        switch(theChar)
        {
            case 'a':
            {
                System.out.println("The char was a");
                break;
            }
            case 'b':
            {
                System.out.println("The char was b");
                break;
            }
            case ('c' | 'd'):
            {
                System.out.println("The char was c or d");
                break;
            }
            default:
            {
                System.out.println("The char didn't match anything, must be something else");
            }
        }
    }

Ultimately, I can't ever get into the case ('c' | 'd') since it would presumably evaluate to a boolean...

So my question is:

  1. Why is it legal to use something like ('c' | 'd') ?
  2. How could that ever be useful, since that would be unreachable
  3. If you ever wanted to case on more than one value, but without using a default, is your only choice to re-implement as an if-else statement?
4 Answers
Related