2016-10-10 3 views
6

javaに奇妙なものがいくつか見つかりました。条件付き代入の数値昇格がJavaで動作する方法

コード:

System.out.println(System.getProperty("java.version")); 
    System.out.println((true) ? (int)2.5 : 3.5); 
    System.out.println((true) ? (int)2.5 : 3); 
    System.out.println((true) ? (int)2.5 + "" : 3.5); 

結果:

 
1.8.0_40 
2.0 
2 
2 

それは何ですか? falseの値がdoubleでない場合、またはtrueの場合に文字列値がvalueに追加された場合にのみ整数値が返される理由は?バグですか?

答えて

4

このspecificationは、Javaで数値昇格を文書化しています。セクション2では、いずれかのオペランドのタイプがdoubleであれば、結果はdouble型であると言います。 (@Janusonによって追加された)このspecificationで、ことが記載されている。条件式のタイプは今第二AND第三のオペランド

の促進タイプである

、もし

System.out.println(System.getProperty("java.version")); 

これはJavaのバージョン(リリース)です。次の2つのドキュメントを例に適用します。それはStringです。

この場合、コンパイラは条件付きの両方の部分を調べ、データ型を決定します。 (int)2.5はintegerであり、3.5はdoubleです。結果はdoubleになります。したがって、整数部分2.5(つまり2)はdoubleにキャストされます。

System.out.println((true) ? (int)2.5 : 3); 

この場合、コンパイラは2つの整数を参照し、結果はintegerです。最初のケースはintegerとなり、2番目のケースもintegerとなり、結果はintegerになります。この場合

System.out.println((true) ? (int)2.5 + "" : 3.5); 

、コンパイラは最初のケースを見て、この数を文字列に追加されるので、それはStringなり、今2である整数部分をとります。結果は文字列になります。 3.5を返そうとするとStringとして返され、doubleでは返されません。

1

3進演算子がその戻り値の型を解決する方法のために。詳細についてはspecificationを確認してください。

最初の式は2.5であるため、第2の整数に変換が、3番目の引数が二重であり、intは次にダブル全体の発現のための型を返す変換であるので、intに2.0

第2の戻りsymply INT 2 2.5ため二重であり、二重返し戻り値の型はintである。

第3は、最初に2.5から2に変換し、次に文字列「2」に変換し、戻り値の型は文字列です。

関連する問題