JDK10から使えるようになったvarによる型推論変数宣言(言い方がこれで良いのかどうか分からない)だけど、JDK10からなそうのか試していないが、JDK12ではチョット厭らしい事が出来てしまうようだ。
本来なら、以下のような構文はエラーとして欲しいと思うんだけど・・・
int num = Integer.parseInt(args[0]);
var x = switch(num) {
case 0 -> “Zero”;
case 1->1;
default -> “Many”;
}; // 結果が整数又は文字列
xの型が、実行時まで決まらないというのは如何な物だろうか?バグの温床となりそうな気がするのだが・・・
(JavascriptのvarやVBのdimのみ(variant型)と同じイメージだよね?)
なお、C#では同様の構文はコンパイルエラーとなる。同じ事をやりたければ、dynamicを使用する必要がある。
C#8.0でも、switch式が導入される予定。(今のところβ)
以下のような感じ。
var s = x switch {
0 => “Zero”,
1 => “One”,
_ => “Many”
};
ちなみに、C#では、返る型が全て同じじゃ無いとコンパイルエラーとなる。
まぁ、varの定義からするとコンパイル時に型が決まっていないとだめだからね。
Javaの場合、もっと単純に、switch式ではなく、3項演算子でも同じ事ができてしまう。
int n;
・・・
var x = n == 0 ? 1 : “Not One”;
↑
コンパイル通るし、実際に実行すると、xの型は実行時に決まる。
C#のdynamicと同じで・・・これいいの?