为什么布尔表达式在case块中有效,当booleans不支持交换机的数据类型时?

Jim*_*mmy 6 java scjp switch-statement java-6 ocpjp

在昨晚阅读了一些SCJP认证后,我开始考虑切换语句以及如何评估表达式,我对某些事情感到有些困惑.

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");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试在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");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

最终,我无法进入案例,('c' | 'd')因为它可能会评估为布尔值...

所以我的问题是:

  1. 为什么使用类似的东西是合法的('c' | 'd')
  2. 这怎么可能有用,因为那是无法实现的
  3. 如果你曾想要多个值,但没有使用默认值,那么你唯一的选择是重新实现if-else语句吗?

Psh*_*emo 12

'c' | 'd'不会返回布尔值.在这种情况下|是按位或不是布尔OR.

您可以在此示例中看到它是如何计算的

System.out.println(Integer.toBinaryString('c'));
System.out.println(Integer.toBinaryString('d'));
System.out.println("=======");
System.out.println(Integer.toBinaryString('c' | 'd'));
Run Code Online (Sandbox Code Playgroud)

产量

1100011
1100100
=======
1100111
Run Code Online (Sandbox Code Playgroud)

二进制1100111等于103十进制整数,因此它是有效的 case参数.


Hie*_*mus 6

'c' | 'd'是一个按位或导致'g',在开关中有效.

您可以匹配多个案例而无需转到if语句

switch(theChar) {
    case 'a':
        break;
    case 'b':
        break;
    case 'c':
    case 'd':
        System.out.println("c or d");
        break;
    default:
        throw new IllegalStateException();
}
Run Code Online (Sandbox Code Playgroud)