2012-03-13 11 views
0

私はJavaを使用しています。variableOfTypeA + = variableOfTypeBを実行している間に奇妙な型キャスト

私は

int integerValue = 100; 
long longValue = 100; 
integerValue = integerValue + longValue; 

をしようとしたとき、私は "型の不一致を:intに長いから変換できません" を取得。

しかし

integerValue+=longValue; 

それは私のためにキャストをやっている意味し、正常に動作します:)

は、それは "+ =" 本質的に提供して何かですか?それに対する具体的な理由は何ですか?

編集:おっと!あまりにも一般的な質問! :)私は徹底的に最初に、私の悪い検索する必要があります!

+0

http://stackoverflow.com/questions/8272635/why-does-java-perform-implicit-type-conversion-from-double-to-の重複整数 - 使用時 – sw1nn

+0

[可能性のあるさまざまな動作の可能性のある重複]の可能な複製(http://stackoverflow.com/questions/2696812/varying-behavior-for-possible-loss-of-precision) –

答えて

3

はい、これはsection 15.26.2 of the JLSの説明とまったく同じです。

形態E1 op= E2の複合代入式はTE1が一度だけ評価されることを除いて、E1のタイプであり、E1 = (T) ((E1) op (E2))と等価です。

1

操作割り当て演算子を使用すると、暗黙のキャストがあります。

int i = 10; 
i *= 5.5; 
// same as 
i *= (int) (i * 5.5); 

または正しいですさえ

char ch = '5'; 
ch /= 1.1; // ch = '0' 
1

。最初の例では、左式の結果結果がlonglongValuelongなので)の値であるため、intにキャストする必要があります。

integerValue = (long) (integerValue + longValue); // this works 

+=オペレータは、(同じ)キャストの暗黙性を行います。

両方の動作は、Java言語仕様で指定されています。

2

Java Puzzlers bookからTweedledumパズルを発見しました。 基本的に、複合代入は型キャストを実行し、通常の代入は行いません。詳細については、JLSを参照してください。