2016-10-10 11 views
5

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に追加された場合にのみ整数値が返される理由は?なぜ2行目の丸めが(int)castによって動作するのですが、double値はまだ返りますか?バグですか?概略において

+0

いいえ、これらはバグではありません。 – Jesper

+4

コンパイラに関する限り、 '?:'式全体には1つの型しか存在せず、両者の間で共通の最も狭い型を見つけることによってそれが分かります。 –

+0

(私は最後の行がコンパイルされていることに驚きました。) –

答えて

3

(true) ? (int)2.5 : 3.5 

     int  double 
      \  /
      double 

doubleリテラル2.5をint 2にダウンサンプリングされた条件式のタイプなので、戻しdouble 2.0に昇格。

4

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25は、これらのすべてのルールを指定します。これらのルールは、観測された出力と常に一致します。

3項式全体に1つのタイプしかありません。返されるのはSystem.out.printlnです。その仕様の表で調べると、あなたが言及した行の型がそれぞれdoubleint、およびObjectになることがわかります。

2

3項演算子は、戻り値の型が定数です。 JLS, section 15.25から

そうでない場合、バイナリ数値昇格(5.6.2)は、オペランドのタイプに適用され、条件式のタイプは、第2及び第3のオペランドの促進タイプです。

これは次いでdoubleに拡大(true) ? (int)2.5 : 3.5に、2.5が(切り捨て)、intに変換されることを意味します。 (true) ? (int)2.5 : 3

intは反対側もintあるため、doubleに拡大する必要がありません。

最後に、(true) ? (int)2.5 + "" : 3.5);の場合はStringに既に変換されているため、を広げることはできません。

関連する問題