JLSセクション 15.25には、オペランドの型に基づいて条件式の型をまとめた表があります。Integer
との場合Double
、表は、型が引数にバイナリ数値昇格を適用した結果になることを示しています ( §15.25.2 )
それ以外の場合、2 進数値昇格 (§5.6.2) がオペランドの型に適用され、条件式の型は 2 番目と 3 番目のオペランドの昇格された型になります。
バイナリ数値プロモーションは、値セットの変換 (§5.1.13) を実行し、ボックス化解除の変換 (§5.1.8) を実行する場合があることに注意してください。
バイナリ数値プロモーションの引用:
オペランドが参照型の場合は、ボックス化解除変換 (§5.1.8) の対象となります。
...
どちらかのオペランドが double 型の場合、もう一方は double に変換されます。
これが起こっていることです
Object object1 = boo ? new Integer(1) : new Double(2.0);
- 参照型
new Integer(1)
はプリミティブint
1 にボックス化されていません。
- 参照型
new Double(2.0)
はプリミティブdouble
2.0 にボックス化されていません。
- 2 進数の昇格が実行され、結果の型は になり
double
ます。この場合、boo
istrue
であるため、プリミティブ1 は1.0int
にプロモートされます。double
- 結果を に格納しているため
Object
、プリミティブの結果はそのラッパー タイプにボックス化されます。
の場合
Object object2;
if (boo)
object2 = new Integer(1);
else
object2 = new Double(2.0);
if/else コンストラクトは数値昇格を実行しません。実際、ボクシング変換はありません。boo
isであるためtrue
、if
パーツが実行されobject2
、 value が設定されますnew Integer(1)
。