昨晩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");
}
}
}
しかし、コンパイラは文句を言わないだろう以下のような場合のブロック、:
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')
に入ることができない...
だから私の質問は次のとおりです。
- なぜそれが
('c' | 'd')
のようなものを使用するのは合法ですか? - これは到達できないので、これまでどんなに役に立つのでしょうか
- デフォルト値を使用せずに複数の値を大文字にしたい場合は、if-else文として再実装する唯一の選択肢です?
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.htmlのようにif文に行かなくても、複数のケースを一致させることができます#jls-15.22.1 – Mat
なぜ届かないのですか? –
「c」と「d」が一致する「c」と「d」と一致する「c」と「d」を試してください。 –