Почему логическое выражение допустимо в блоке case, если логические значения не поддерживаются для переключателей?

Прочитав кое-что из сертификации SCJP прошлой ночью, я задумался об операторах switch и о том, как оцениваются выражения, и что-то меня немного озадачило.

Java не позволит вам включить логическое значение, поэтому следующее не будет компилироваться:

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");
            }
        }
    }

Однако компилятор не будет жаловаться, если вы попытаетесь использовать выражение, которое оценивается как логическое значение в блоке case, например:

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");
            }
        }
    }

В конечном счете, я никогда не смогу вникнуть в дело ('c' | 'd'), так как оно, по-видимому, будет иметь логическое значение...

Итак, мой вопрос:

  1. Почему разрешено использовать что-то вроде ('c' | 'd')?
  2. Как это может быть полезно,так как это было бы недостижимо
  3. Если вы когда-либо хотели использовать регистр более чем для одного значения, но без использования значения по умолчанию, был ли ваш единственный выбор повторно -реализовать как оператор if -else?
6
задан Jimmy 8 August 2012 в 10:30
поделиться