0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Javaの三項演算子くん... お前…

Posted at

はじめに

この記事は、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とか言うクソ言語もうよぐわがんね

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?