条件式トラップ
Object o = true ? new Integer(1) : new Double(2.0);
System.out.println(o);
上のコードは何を印刷しますか?多くの人が印刷:1を感じていると思います.
次のように考えられます.
Object o2;
if (true)
o2 = new Integer(1);
else
o2 = new Double(2.0);
System.out.println(o2);
テストを行うと、最初のコード印刷:1.0が見つかりました.2段目のコード印刷:1.
条件演算子ルールを参照し、コア3点をまとめます.
1、2番目と3番目が同じタイプであれば、条件式のタイプです.
2、あるオペランドのタイプがTである場合、Tはbyte、short、charであり、もう一つのオペランドがintタイプの定数式である場合、条件式のタイプがTである場合、結果はタイプTである.
3、そうでなければオペランドタイプに対して2進数を用いて昇格し、式のタイプは2番目と3番目のオペランドが昇格したタイプである.
最初のセグメントのコードのタイプがDoubleタイプに昇格し、より多くのテストを続けました.
Object o = true ? new Byte("1") : new Short("2");
Object o1 = true ? new Short("1") : new Integer("2");
Object o2 = true ? new Integer(1) : new Double(2.0);
Object o3 = true ? new Integer(1) : new Float(2.0);
Object o4 = true ? new Double(2.0) : new Float(2.0);
Object o5 = true ? new Byte("1") : 2;
Object o6 = true ? 1 : new Float(2.0);
Object o7 = true ? 1 : new Short("2");
Object o8 = true ? 1 : 2.0;
byte x = 1;
Object o9 = true ? x : 2;
Object o10 = true ? x : new Integer("2");
System.out.println("o=" + o + " :" + o.getClass());
System.out.println("o1=" + o1 + " :" + o1.getClass());
System.out.println("o2=" + o2 + " :" + o2.getClass());
System.out.println("o3=" + o3 + " :" + o3.getClass());
System.out.println("o4=" + o4 + " :" + o4.getClass());
System.out.println("o5=" + o5 + " :" + o5.getClass());
System.out.println("o6=" + o6 + " :" + o6.getClass());
System.out.println("o7=" + o7 + " :" + o7.getClass());
System.out.println("o8=" + o8 + " :" + o8.getClass());
System.out.println("o9=" + o9 + " :" + o9.getClass());
System.out.println("o10=" + o10 + " :" + o10.getClass());
印刷:
o=1タイプ:class java.lang.Short
o 1=1タイプ:class java.lang.Integer
o 2=1.0タイプ:class java.lang.Double
o 3=1.0タイプ:class java.lang.Float
o 4=2.0タイプ:class java.lang.Double
o 5=1タイプ:class java.lang.Byte
o 6=1.0タイプ:class java.lang.Float
o 7=1タイプ:class java.lang.Short
o 8=1.0タイプ:class java.lang.Double
o 9=1タイプ:class java.lang.Byte
o 10=1タイプ:class java.lang.Integer
条件式の2つのタイプが異なる場合、byte、short、charを除いて、式のタイプが自動的にアップグレードされます.上記の3点を覚えて、条件式のトラップを防止します.