15

A colleague of mine asked this question to me and I am kind of confused.

int i = 123456;
short x = 12;

The statement

x += i;

Compiles fine however

x = x + i;

doesn't

What is Java doing here?

Raedwald
  • 46,613
  • 43
  • 151
  • 237
Em Ae
  • 8,167
  • 27
  • 95
  • 162

3 Answers3

20
int i = 123456;
short x = 12;
x += i;

is actually

int i = 123456;
short x = 12;
x = (short)(x + i);

Whereas x = x + i is simply x = x + i. It does not automatically cast as a short and hence causes the error (x + i is of type int).


A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

- JLS §15.26.2

Community
  • 1
  • 1
arshajii
  • 127,459
  • 24
  • 238
  • 287
4

The + operator of integral types (int, short, char and byte) always returns an int as result.

You can see that with this code:

//char x = 0;
//short x = 0;
//byte x = 0;
int x = 0;
x = x + x;

It won't compile unless x is an int.

Gilberto Torrezan
  • 5,113
  • 4
  • 31
  • 50
2

Numbers are treated as int unless you specifically cast them otherwise. So in the second statement when you use a literal number instead of a variable, it doesn't automatically cast it to the appropriate type.

x = x + (short)1;

...should work.

jefflunt
  • 33,527
  • 7
  • 88
  • 126
asteri
  • 11,402
  • 13
  • 60
  • 84
  • I wrote wrong equation. I updated my question. See its `x = x + i`. – Em Ae Sep 21 '12 at 20:32
  • Ok, then why doesn't x = x + x; work? The problem isn`t on the number 1 but on the + operator that returns an int. – lleite Sep 21 '12 at 20:34