4

Javaをいじっていて、あることに気づきました。ここで最もよく示すことができます:

boolean boo = true;

Object object1 = boo ? new Integer(1) : new Double(2.0);

Object object2;
if (boo)
    object2 = new Integer(1);
else
    object2 = new Double(2.0);

System.out.println(object1);
System.out.println(object2);

2つは同じであると予想しますが、これが印刷されるものです:

1.0
1

誰かがこれについて良い説明を持っていますか?

4

2 に答える 2

3

三項は両方の条件で同じ型を返す必要があるため、最初の結果 ( Integer) は一致するように倍精度に昇格2.0されます。また、参照してください。

Object object1 = boo ? new Integer(1) : new Double(2.0);
System.out.println(object1.getClass().getName());

これはJLS-15.25.2 - Numeric Conditional Expressionsで文書化されています (部分的に)

それ以外の場合、バイナリ数値昇格 ( §5.6.2 ) がオペランドの型に適用され、条件式の型は 2 番目と 3 番目のオペランドの昇格された型になります。

バイナリ数値プロモーションは、値セットの変換 ( §5.1.13 ) を実行し、ボックス化解除の変換 ( §5.1.8 ) を実行する場合があることに注意してください。

于 2016-01-09T13:50:35.040 に答える
1

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)はプリミティブint1 にボックス化されていません。
  • 参照型new Double(2.0)はプリミティブdouble2.0 にボックス化されていません。
  • 2 進数の昇格が実行され、結果の型は になりdoubleます。この場合、booistrueであるため、プリミティブ1 は1.0intにプロモートされます。double
  • 結果を に格納しているためObject、プリミティブの結果はそのラッパー タイプにボックス化されます。

の場合

Object object2;
if (boo)
    object2 = new Integer(1);
else
    object2 = new Double(2.0);

if/else コンストラクトは数値昇格を実行しません。実際、ボクシング変換はありません。booisであるためtrueifパーツが実行されobject2、 value が設定されますnew Integer(1)

于 2016-01-09T13:49:54.993 に答える