3

次のコード行がありました

long longnum = 555L;
int intnum = 5;
intnum+=longnum;
intnum= intnum+longnum; //Type mismatch: cannot convert from long to int
System.out.println("value of intnum is: "+intnum);

行 3 と行 4 は同じタスクを実行すると思いますが、コンパイラが行 4 で「型の不一致: long から int に変換できません」というエラーを表示する理由

助けてください。

4

3 に答える 3

12

これは、複合代入演算子が暗黙のキャストを行うためです。

JLS複合代入演算子から:

の形式の複合代入式E1 op= E2は と同等ですE1 = (T) ((E1) op (E2))。ここで、Tは の型ですがE1E1は 1 回だけ評価されます。

二項+演算子の場合は、明示的にキャストする必要があります。4 番目の課題を作成します。

intnum = (int)(intnum+longnum);

そしてそれはうまくいくでしょう。これは、複合代入式が評価されるものです。

于 2013-10-05T11:10:40.837 に答える
11

行 3 と行 4 は同じタスクを実行すると思いますが、コンパイラが行 4 で「型の不一致: long から int に変換できません」というエラーを表示する理由

彼らは同じことをしていないからです。複合代入演算子には暗黙のキャストがあります。

JLS のセクション 15.26.2から:

の形式の複合代入式E1 op= E2は と同等ですE1 = (T) ((E1) op (E2))。ここで、Tは の型ですがE1E1は 1 回だけ評価されます。

したがって、3行目は次のようになります。

intnum = (int) (intnum + longnum); 

intnum + longnum式では、算術演算で加算が実行される前にバイナリ数値昇格が適用されlong、結果が になるため、キャストが必要ですlonglongからへの暗黙的な変換はないintため、キャストされます。

于 2013-10-05T11:10:57.070 に答える