条件式トラップ

2733 ワード

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点を覚えて、条件式のトラップを防止します.