はじめに
この記事は、Javaの三項演算子くんについて言いたいことだけを書く
つまらない記事になると思いますが よろしくお願いします
… Javaくん?!
ある日のこと 私はJavaのシルバーの問題を解くことになった
そこで出た問題がこれだ
//著作権回避のために変数名や、条件の中身を変えてます
public class Main{
public static void main(String... args){
int hoge1 = 300;
int hoge2 = hoge1++;
int hoge3 = ++hoge2;
int hoge4 = hoge3++;
System.out.println((hoge1 > hoge2) ? (hoge2 > hoge3) : (hoge3 > hoge4) ? hoge3 : hoge4 );
}
}
ここで私はこう思った
これインクリメントの問題に見せかけた、三項演算子の左辺と右辺が違うからコンパイルエラーになる問題か
昔から型安全を保証してるJavaがこれで通すわけ無いでしょ
通った
$javac Main.java
$java Main.java
302
…まじかよ
は? Javaだぞ? Javascriptじゃねえんだぞ?
えぇぇぇぇぇぇぇぇぇぇぇぇ
うそやん
public class Main{
public static void main(String... args){
//省略
Object obj = (hoge1 > hoge2) ? (hoge2 > hoge3) : (hoge3 > hoge4) ? hoge3 : hoge4 ;
System.out.println(obj.toString());
}
}
どうやら、Javaでは三項演算子の左辺と右辺が違うと、Objectクラスに変化させて、対応をするような仕様らしい
…Objectは整数型じゃないのに… どうして
そういうもん
Javaは勝手にint -> Integerやboolean -> Booleanにしてくれる、オートボクシング機能ってのが備わっていて、そいつがこれで働いたらしい
List<Integer> list = new ArrayList<>();
list.add(1);
ここで使われている機能が、「三項演算子の左辺と右辺のスーパークラス」であるObjectにするため、勝手にはたらいたらしい
というか
Object obj = 10; //これでもコンパイルが通る
...???????
Javaとか言うクソ言語もうよぐわがんね